1. 指针作为函数的参数
咱们可以给一个函数传一个 整型、字符型、浮点型的数据,也可以给函数传一个地址。
例:
int num;
scanf("%d",&num);
函数传参:
(1)、传数值:
例 22: void swap(int x,int y) { int temp; temp=x; x=y; y=temp; } int main() { int a=10,b=20; swap(a,b); printf("a=%d b=%d\n",a,b);//a=10 b=20 }
实参:调用函数时传的参数。
形参:定义被调函数时,函数名后边括号里的数据
结论:给被调函数传数值,只能改变被调函数形参的值,不能改变主调函数实参的值
(2)、传地址:
例 23: void swap(int *p1,int *p2) { int temp; temp= *p1; *p1=*p2;// p2 指向的变量的值,给 p1 指向的变量赋值 *p2=temp; } int main() { int a=10,b=20; swap(&a,&b); printf("a=%d b=%d\n",a,b);//结果为 a=20 b=10 }
结论:调用函数的时候传变量的地址,在被调函数中通过*+地址来改变主调函数中的变量的值
例 24: void swap(int *p1,int *p2)//&a &b { int *p; p=p1; p1=p2;//p1 =&b 让 p1 指向 main 中的 b p2=p;//让 p2 指向 main 函数中 a }//此函数中改变的是 p1 和 p2 的指向,并没有给 main 中的 a 和 b 赋值 int main() { int a=10,b=20; swap(&a,&b); printf("a=%d b=%d\n",a,b);//结果为 a=10 b=20 }
总结:要想改变主调函数中变量的值,必须传变量的地址, 而且还得通过*+地址 去赋值
例 25: void fun(char *p) { p="hello kitty"; } int main() { char *p="hello world"; fun(p); printf("%s\n",p);//结果为: hello world }
答案分析: 在 fun 中改变的是 fun 函数中的局部变量 p,并没有改变 main 函数中的变量 p,所以 main 函数中的, 变量 p 还是指向 hello
例 26: void fun(char **q) { *q="hello kitty"; } int main() { char *p="hello world"; fun(&p); printf("%s\n",p);//结果为:hello kitty } 总结一句话:要想改变主调函数中变量的值,必须传变量的地址,而且还得通过*+地址 去赋值。无 论这个变量是什么类型的。
(3) 给函数传数组:
给函数传数组的时候,没法一下将数组的内容作为整体传进去。 只能传数组名进去,数组名就是数组的首地址,即只能把数组的地址传进去。 也就是说,只能传一个 4 个字节大小的地址编号进去
例 27:传一维数组的地址
//void fun(int p[])//形式 1 void fun(int *p)//形式 2 { printf("%d\n",p[2]); printf("%d\n",*(p+3)); } int main() { int a[10]={1,2,3,4,5,6,7,8}; fun(a); return 0; }
例 28:传二维数组的地址
//void fun( int p[][4] )//形式 1 void fun( int (*p)[4] )//形式 2 { } int main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; fun(a); return 0; }
例 29:传指针数组
void fun(char **q) // char *q[] { int i; for(i=0;i<3;i++) printf("%s\n",q[i]); } int main() { char *p[3]={"hello","world","kitty"}; //p[0] p[1] p[2] char * fun(p); return 0; }