函数:
1.函数的定义
2.函数的调用
3.函数的声明
1.函数传参:
1.赋值传递(复制传递)
函数体内部想要使用函数体外部变量值的时候使用复制传递
2.全局变量传递
3.地址传递
函数体内部想要修改函数体外部变量值的时候使用地址传递
函数体内想修改函数体外指针变量值的时候传指针变量的地址即二级指针
注意:这是值传递不是地址传递
区分赋值传递和地址传递关键在于看实参中所传是变量的值还是变量的地址
这才是地址传递(二级指针传递)
4.整形数组传递
int a[5] = {1, 2, 3, 4, 5};
int Fun(int parray[5]); //很少用,除非限定了数组的长度(pipe中用到)
int Fun(int parray[], int len); //后两个长度传多少就操作几个元素
int Fun(int *parray, int len); //这是本质(本质传的都是指针),用这种最规范
注意:这是值传递
这里a作为数组首元素的地址,是一个常量,是值传递不是地址传递,不会因被调的操作而改变。
指针做值传递,不会改变指针的值,但可以在被调中通过指针加偏移量来改变指针所指向空间的值
5.字符型数组和字符串的传递
char str[32] = {"hello world"};
int Fun(char *pstr); //字符型数组传参时只需要传数组首元素的地址,不要传数组长度(昌都可以根据 '\0' 来算出)
6.整形二维数组传递
int a[2][3] = {1, 2, 3, 4, 5, 6};
int Fun(int (*parray)[3], int len); //传二维数组的数组名(二维数组的数组名是指向数组第一行元素的一个数组指针)和行数
对数组指针取*,值不变,类型降级为指向第一个元素的指针(原来是指向第一行的指针)
7.字符型二维数组传递
char str[5][32] = {"hello", "world", "how", "are", "you"};
int Fun(char (*pstr)[32], int len);
多个字符串存储用二维数组,操作用指针数组
8.指针数组传递
char *pstr[5] = {NULL};
int Fun(char **ppstr, int len);
9.结构体变量传递(整个的拷贝)
struct student s;
int Fun(struct student tmp);
10.结构体指针传递(只拷贝要用的,占用内存更小)
struct student s;
int Fun(struct student *ps);
11.结构体数组传递
struct student stu[3];
int Fun(struct student *pstu, int len);
注意:
1.传递数组,外面怎么操作数组,里面就怎么操作数组
2.一维数组就传数组名和长度(一维字符型数组只传数组名)
二维数组就传数组名和行数