C语言之旅(5)参数传递(值传递,指针传递,数组传递)
看下图:值传递
在这里我写了一个加法的函数 int Add(int a,int b); a,b是函数的形参;在这个程序中1,2是实参。值传递:实参赋值给形参,在我调用Add(1,2);函数的时候,其实是实现了两步:
1.a=1,b=2;
2.执行函数。这就是值传递。
指针传递:
从上图可以看出来我明明要进行数值c,d的交换,但是为什么输出的结果依旧是原来的。因为在这个时候你用的是值传递,并没有改变原来的主函数的值,就是操作的作用域不同,其实在调用这个函数的时候执行了两步:
1.a=c,b=d;(这个时候a=1,b=2;并且原来的c=1,d=2;)
2.在Exchange(int a,int b);函数中进行数值的交换,但是交换的只是局部变量a和b并没有改变c和d.
所以应该用下面的方法:指针传递:
在这里面,Exchange(int *a,int *b);这个函数传递的是c和d的地址。所以在Exchange函数里面操作的两个内存空间,是真正的c和d的内存空间。所数值交换也是交换了c和d的数值。
因此,如果我们想要改变数值的实参的话就应该传递实参的地址,值传递不能对实参进行任何的改变。
数组传递:
int arr[4]={1,2,3,4};
void MySort(int arr[]);
在这个排序的函数中,int arr[]的意思相当于 int * p;
当数组当做参数传递的时候,数组就相当于是指针,这是后传递的是数组首元素的首地址。