c基础(二)

指针:

  含义:是一个值,一个值代表着一个内存地址,类似于存放路径   

* 运算符 :

  1 字符*表示指针

作用:通常跟在类型关键字的后面,表示指针指向的是什么类型的值
int * foo, * bar;声明指针后会随机分配一个内存空间,指针指向的数据是随机的指针的初始化:
int* p;
int i;p = &i;
*p = 13;未初始化的指针数据最好这样定义:int* p = NULL;

 2 运算符

作用:用来取出指针变量所指向的内存地址里面的值
* foo  取出定义的指针的值/*注意,数组名指向的地址是不能更改的*/

& 运算符:

作用:用来取出一个变量所在的内存地址int i = 5;if (i == *(&i)) // 正确,*(&i)含义:先取出i的内存地址,在获取内存地址对应的值

 运算:

     1 指针与整数值的加减运算

           指针与整数值的运算,表示指针的移动。

     2 指针与指针的加法运算

          两个指针进行加法是非法的

     3 指针与指针的减法

          相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位。

          高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值

      返回值:ptrdiff_t类型,一个带符号的整数类型别名

     4 指针与指针的比较运算

        比较的是各自的内存地址哪一个更大,返回值是整数1(true)或0(false)

函数:

    基础结构:

#include <stdio.h>/* 基础结构*/int main(void)
{int m = addNum(3); /* 使用函数, 3 传递的参数*/printf("m=%d", m);
}int addNum(int a)   /* int addNum 定义函数名称  (int a 传递参数,可以传递多个,使用逗号分开) */
{                /*{函数体:使用此方法需要执行的语句}*/return a;      /* return  a; return  返回值,返回计算之后的数据 */
}

参数:

传递的参数是拷贝的数据,非自身数据,不会实时更新数据;
除非1 函数返回最新的数据,才可以获取并赋值最新的数据2 直接修改自身的署,传入变量的地址(函数不要返回内部变量的指针)void Swap(int* x, int* y) {int temp;temp = *x;*x = *y;*y = temp;
}int a = 1;
int b = 2;
Swap(&a, &b);//参数为数组
int sum_array(int a[n], int n) {// ...
}int sum = sum_array(a, 4);
//等同于
int sum = sum_array((int []){3, 5, 7, 3}, 4);/*多维数组*/
int sum_array(int n, int m, int a[n][m]);

  参数数量是不确定时,声明函数的时候,可以使用省略号...表示可变数量的参数

 注意:...符号必须放在参数序列的结尾,否则会报错

#include<stdio.h>  #include<stdarg.h> /* 可以操作可变参数的类*/double average(int i, ...);double average(int i, ...) {double total = 0;va_list ap;            /*va_list 一个数据类型,用来定义一个可变参数对象*//*  va_start(ap, i); 将参数i后面的参数统一放入ap*/va_start(ap, i);       /*va_start 一个函数,用来初始化可变参数对象  va_start(可变参数对象,正常参数,用来为可变参数定位)*/printf("i=%d \n", i);for (int j = 1; j <= i; ++j) {/* va_arg(ap, double)用来从ap依次取出一个参数,并且指定该参数为 double 类型*/total += va_arg(ap, double); /* va_arg 一个函数,用来取出当前那个可变参数 va_arg(可变参数对象,当前可变参数的类型)*/printf("total=%d \n", total);}printf("ap=%d \n", ap);va_end(ap);           /* va_end 一个函数,用来清理可变参数对象*/return total / i;
}int main(void)
{int total=average(0,8,10);printf("total=%d", total);
}

递归函数:

函数可以调用自身,这就叫做递归(recursion)例如:
#include <stdio.h>int main(void)
{int m = addNum(3);printf("m=%d", m);
}int addNum(int a)
{a++ ;if (a <= 5){addNum(a);}else{return a;}
}注意:在使用递归函数时,注意做好判断,不然容易出现死循环

入口函数:

main()是程序的入口函数,所有的程序必须要有
类似于页面加载方法,首先执行此方法
其他的方法需要通过main调用#include <stdio.h>int main(void)
{int m =3;printf("m=%d", m);return 0;     /* 表示函数结束运行,返回0;  返回非零数据表示运行失败*/
}

函数指针:

调用函数的方法
// 写法一  常用的 函数名本身就是指向函数代码的指针,通过函数名就能获取函数地址
print(10)// 写法二
(*print)(10)// 写法三
(&print)(10)// 写法四
(*print_ptr)(10)// 写法五
print_ptr(10)#include<stdio.h>  int addNum(int a)
{return a;
}int main(void)  /*调用其他方法时,其他方法要么写在最前面, 或者使用函数原型*/
{// int m = addNum(3);// printf("m=%d", m);int m = (*addNum)(10);printf("m=%d", m);
}优点:
可以明确参数是一个函数参数一就是一个函数
int compute(int (*myfunc)(int), int, int);
函数原型:提前告诉编译器,每个函数的返回类型和参数类型int twice(int);int main(int num) {return twice(num);
}int twice(int num) {return 2 * num;
}注意,函数原型必须以分号结尾。一般来说,每个源码文件的头部,都会给出当前脚本使用的所有函数的原型。

exit函数:

作用:终止程序的运行
前提: #include<stdlib.h>
返回值(stdlib.h已定义,无需定义):EXIT_SUCCESS(相当于 0)表示程序运行成功EXIT_FAILURE(相当于 1)表示程序异常中止
atexit()函数:用来登记exit()执行时额外执行的函数,用来做一些退出程序时的收尾工作

说明符:

 extern 说明符 :

extern int foo(int arg1, char arg2);
extern 表示:导入使用,声明此方法未在此文件定义,是从其他文件内引入使用的int main(void) {int a = foo(2, 3);// ...return 0;
}

static 说明符:

1 用于函数内部声明变量时,表示该变量只需要初始化一次,不需要在每次调用时都进行初始化

static可以用来修饰函数本身,表示该函数只能在当前文件里使用,如果没有这个关键字,其他文件也可以使用这个函数(通过声明函数原型)

3 用在参数里面,修饰参数数组

int sum_array(int a[static 3], int n) { /* 数组长度至少为3*/}

注意:

 static修饰的变量初始化时,只能赋值为常量,不能赋值为变量

   局部作用域中,static声明的变量有默认值0

const 说明符:

1 函数内部不得修改该参数变量

void f(const int* p) {int x = 13;p = &x; // p本身的地址是允许修改的*p = 0; //const声明的* p 不能修改,修改之后报错
}
void f(int* const p) { //不允许修改p,就使用const定义int x = 13;p = &x; // 该行报错
}/* p和*p 都不允许修改 */
void f(const int* const p) {
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins部署项目

一.安装jenkins 1.1进入jenkins官网下载jenkins war包&#xff0c;上传到服务器/usr/local目录。 1.2执行启动jenkins命令&#xff0c;&#xff08;注意jenkins版本需要的jdk版本&#xff09; /usr/local/java11/bin/java -Djava.awt.headlesstrue -jar /usr/local/jenkins.wa…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

fastApi 项目

参考&#xff1a; 中文文档&#xff1a;FastAPI API接口开发其实特简单&#xff0c;Python FastApi Web 框架教程来了_根据接口文档用fastapi开发接口-CSDN博客 Python框架篇(1):FastApi-快速入门 - 知乎 官方示例目录结构 更大的应用 - 多个文件 - FastAPI . ├── app …

[讲座] - 闲聊工业设计

1&#xff0c;工业设计相关的学科分类 2&#xff0c;工业设计的职业发展路线 3&#xff0c;工业设计师的成名人物 4&#xff0c;设计了可口可乐的Loewy 可口可乐的瓶子&#xff0c;无论白天晚上还是瓶子被打碎&#xff0c;都能认出这个是可口可乐的瓶子。 草图参照了可可豆&am…

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…

Cuk、Zeta和Sepic开关电源拓扑结构

Cuk、Zeta和Sepic变换器,三种拓扑结构大致类似。不同点在于电感和二极管&#xff0c;MOS管的位置关系的变化。 Cuk电源是一种非隔离的直流电源转换器&#xff0c;其基本结构包括输入滤波电容、开关管、输入电感、输出电感和输出电容等元件。Cuk电路可以看作是Boost和Buck电路的…

基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 双闭环PI控制器设计 4.2 SVPWM技术 4.3 控制系统实现 5.完整工程文件 1.课题概述 基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真。系统包括逆变桥、PMSM、park变换、clark变换、SVPWM、PI控…

解决电脑访问共享文件问题:“无法访问。你可能没有权限使用网络资源。请与这台服务器的......”

文章目录 1. 问题2. 解决方法 1. 问题 2. 解决方法 Win R 键入 gpedit.msc在弹出的窗口,展开左侧目录树至安全选项,如图。( 计算机配置-Windows设置:安全设置-本地策略-安全选项)

从0开始python学习-36.pytest中yaml的基本数据结构及锚点引用

目录 1.数据类型 1.写入格式 1. 对象&#xff08;字典&#xff09;&#xff1a;键:(空格)值 2. 数组&#xff08;列表&#xff09;&#xff1a;它是使用一组横线"-"开头 2. 嵌套形式 1. 列表中的字典 2. 字典中的字典 3. 字典中的列表 4. 同时有列表和字典 …

2023我的编程之路

你的编程学习经历和成长过程&#xff1a; 在我探索编程世界的旅程中&#xff0c;我深刻地认识到&#xff0c;编程不仅仅是一种技术&#xff0c; 是一种思维方式&#xff0c; 一种解决问题的方法。希望通过分享我的编程学习体验&#xff0c;能够启发更多的人看到编程的魅力和价值…

克隆clone github上某个项目的子目录

有时会遇到只需要克隆github某个项目的子目录&#xff0c;此时可以使用以下方法实现&#xff1a; 需求示例&#xff1a; 现需要克隆&#xff1a;https://github.com/SingleZombie/DL-Demos项目中的ddim项目 注&#xff1a;ddim项目的地址为&#xff1a;https://github.com/Sing…

lenovo联想小新Pro-13 2020 Intel IML版笔记本电脑(82DN)原装出厂Win10系统镜像

链接&#xff1a;https://pan.baidu.com/s/1bJpfXudYEC7MJ7qfjDYPdg?pwdjipj 提取码&#xff1a;jipj 原装出厂Windows10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&a…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台

数据库云平台软件厂商「北京新数科技有限公司」&#xff08;以下简称「新数科技」&#xff09;已于2023年完成B1轮和B2轮融资&#xff0c;分别由渤海创富和彬复资本投资&#xff1b;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年&#xff0c;当前产品矩阵包括数据库…

一起玩儿物联网人工智能小车(ESP32)——23. 变量与函数(一)

摘要&#xff1a;本文介绍变量和函数的基本知识 经过一个阶段的学习&#xff0c;大家对程序开发也有了一个初步的了解。这只能说是刚刚开始&#xff0c;所能实现的功能还非常的有限。接下来就是拓展一下大家的基本开发技能。 在前面的开发中&#xff0c;大家如果认真的练习并且…

kotlin foreach 循环

java中的foreach循环也使用于kotlin &#xff0c;先回顾下java里面的foreach循环 java foreach循环格式 for(元素类型t 元素变量x : 遍历对象obj){引用了x的语句;} 例如&#xff1a; int[] intary {1,2,3,4};for (int a: intary) {Log.d("intary", String.value…

模拟控制方式(PWM)

引言 PWM&#xff08;脉冲宽度调制&#xff09;是一种常见的模拟控制方式&#xff0c;通过调节脉冲宽度来控制功率输出的占空比&#xff0c;从而实现模拟信号的传输和控制。在许多领域中&#xff0c;PWM都得到了广泛的应用&#xff0c;如电机控制、LED调光、音频控制等。本文将…

关于this.router 和this.route的总结

this.router 和this.route这2个东西一直在用可是我还是迷迷糊糊的不知道啥啥意思&#xff0c;尤其是idea的提示功能&#xff0c;总是让我一个回车就弄错了。 总结一波&#xff1a; 概述 this.$router(路由实例) : 是VueRouter的实例.包含了很多属性和对象&#xff08;比如 h…

【PHP】PHP实现RSA加密,解密,加签,验签

1.php RSA生成公私钥 // 生成密钥对 $config array("digest_alg" > "sha256", // 加密算法"private_key_bits" > 2048, // 密钥长度&#xff08;位数&#xff09; );// 创建并保存私钥到文件 $res openssl_pkey_new($config); if (!fil…