数组传参是我在写快速排序时遇到的基础问题
我提出的问题如下:
- quick_sort(array, 0, length-1) 这个array是数组名的意思吗?
- void quick_sort(int array[],int left,int right) 那这个定义函数的时候 为什么又是指数组元素呢?
解答如下:
- 数组作为参数进行了传递。也就是,数组用作函数参数。
- C语言标准规定,作为“某类型的数组”的形参应该调整为“某类型的指针”。//本质是指针
- 在函数形参定义这个特殊情况下,编译器必须把数组形式改写成指向数组第 0 个元素的指针形式。
- 编译器只向函数传递数组的地址,而不是整个数组的拷贝。
- 这种隐式转换意味着下面三种形式的函数定义是完全等价的,举例如下:
void func(int *parr){ ...... } |
void func(int arr[]){ ...... } |
void func(int arr[5]){ ...... } |
在函数内部,arr 会被转换成一个指针变量。
参数传递是一次赋值的过程,赋值也是一个表达式,函数调用时不管传递的是数组名还是数组指针,效果都是一样的,相当于给一个指针变量赋值。
精华解答:
定义时的void quick_sort(int array[],int left,int right);中的形参int array[]隐式转换成了指针;
调用时的quick_sort(array, 0, length-1);的array是给指针变量赋值的过程。