1 使用指针变量作为函数参数
用指针变量作为函数参数可以将函数外部的地址传递到函数内部,使得函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。
有些初学者会使用下面的方法交换两个变量的值:
void swap(int a, int b) { int temp; //临时变量 temp = a; a = b; b = temp; } void main() { int a=11, b=99; swap(a, b); }
其结果是a、b的值并没有发生改变,交换失败。这是因为swap函数内部的a、b和main函数内部的a、b是不同的变量,占用不同的内存。正确做法是使用指针变量参数。
void swap(int *a, int*b) { int temp; temp = *a; *a=*b; *b=temp; } void main() { int a=11, b=99; swap(&a,&b); }
2 使用数组指针作为函数参数
数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望函数内部操作数组,必须传递数组指针。
/* 将数组由大到小排序 冒泡排序 */ void max(int*arr, int len) { int i,j,temp; for(i=0;i<len;i++){ for(j=0;j<len-i-1;j++){ if(arr[j]<arr[j+1]){ temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } } } }
void main(){ int num[6]; int len=sizeof(num)/sizeof(int); for(k=0;k<len;k++){ scanf("%d",num+k); } max(num, 6); for(k=0; k<len; k++){ printf("%d ",num[k]); } }
3 使用数组作为函数参数
C语言中,当数组作为函数的形参时,编译器必须把数组形式改成指向数组第0个元素的指针形式。即编译器只传递数组的地址,而不是整个数组的拷贝。
void func(int arr[ ]){ ...... } void func(int arr[5]){ ...... }
等价于:
void func(int *parr){ ...... }
在函数内部,arr是一个指针变量,sizeof(arr)=4。