一、二级指针
1.概念
概念:二级指针也是个指针,该指针用来存放另外一个一级指针在内存中的地址(指向指针的指针)
二级指针解引用一次,变成一级指针
2.定义二级指针
int a=88;
int *p=&a;
int **q=&p;
3.使用二级指针
*q --》二级指针解引用一次,结果是*&p--》p
**q --》二级指针解引用两次,结果是**&p--》*p--》a
二、函数的基本概念
1.概念
函数是用来处理问题的一段代码,我们把代码封装起来变成了函数,函数提高了代码的复用性
2.定义函数
返回值类型 函数名字(形参列表)
{
函数的具体代码
}
写法一: 把函数的声明和定义都写在主函数的前面
写法二: 函数的声明放在主函数的前面,函数的定义放在主函数的后面
写法三: 函数的声明放在主函数的前面,函数的定义放在单独的.c文件中
3.函数的使用(调用)
语法规则:函数名字(实参);
4.函数调用的过程分析
总结:函数调用的时候自动入栈,函数执行完毕,自动出栈
5.实参和形参之间的关系
1.我关于传值和传递值的理解
(1)实参和形参拥有各自独立的地址空间
(2)实参赋值给形参有两种
传值:实参把自己的值拷贝一份给形参
传地址:实参把自己的地址赋值给形参
(3)实参和形参同名,可以同名,但是毫无关系,各自独立
6.全局变量和局部变量
6.1 概念
全局变量:在所有函数的外面定义的变量就是全局变量,全局变量整个.c文件以及其他.c文件都可以使用(全局变量的作用域是文件作用域)。任意一个函数修改全局变量,整个程序里后续所有函数使用的都是修改后的值
局部变量:在函数花括号内部定义的变量都是局部变量
局部变量只能在定义它的那个函数内部使用,其它地方不可以使用(局部变量的作用域是局部作用域)
专业术语:作用域(变量的作用范围)
6.2 全局变量跟局部变量同名
局部变量跟全局变量同名,此时局部变量会隐藏全局变量,导致全局变量无法使用
6.3 初始化
全局变量没有初始化,默认都是0
局部变量没有初始化,默认是随机数
7.函数的返回值和形参
返回值只有如下三种情况
第一种:没有返回值 void
第二种:返回普通变量类型
第三种:返回指针,一定不可以返回局部变量的地址
原因:局部变量的作用域只是在定义它的函数中生效,当函数退出的时候,该局部变量(栈空间)的地址空间会被自动释放
如果是返回局部变量的值,是没有问题的(编译器会把局部变量的值备份一份到寄存器中),返回的就是寄存器里面的那个备份值
形参只有三种情况
第一种:没有形参 int fun(){ }
第二种:有形参,普通变量--》实参传值给形参
第三种:有形参,指针--》实参传地址给形参
8.数组作为函数的形参
8.1 一维数组作为函数的形参
int a[10]={56,89,10};
int fun(int buf[10]) //写法一
int fun(int *p) //写法二
8.2 二维数组作为函数的形参
int a[3][4]={56,89,10};
int fun(int buf[3][4]);
int fun(int *p,int n1,int n2);
8.3 任何数组作为函数的形参,求大小
任何数组作为函数的形参,sizeof()求大小都是当成指针来求大小
数组作为函数的形参时会退化为指针