在做c语言题目的时候,发现一个挺有意思的现象:当往一个函数中传入数组时,传入 a[],
*a,
a[x](x为数组长度),函数都能正常运行;讲道理传入的函数类型都不一样,怎么又能得
到一样的结果呢?
下面就写一个程序来看看编译器到底是怎么处理的:
#include <stdio.h> #include <stdlib.h> //void printfArray(int a[7], int num) //以a[7]传入函数后长度与以a[]传入相同 //void printfArray(int a[], int num) void printfArray(int *a, int num) { int i = 0; int num2 = 0; //查看传入数组的本质 num2 = sizeof(a) / sizeof(a[0]); printf("当数组作为形参传入函数中,长度:num2 == %d\n", num2); for (i = 0; i < num; i++) { printf(" %d ", a[i]); } printf("\n\n"); } //void sortArray(int a[7], int num) //void sortArray(int a[], int num) void sortArray(int *a, int num) { int i = 0; int j = 0; int tmp; int num2 = 0; //查看传入数组的本质 num2 = sizeof(a) / sizeof(a[0]); printf("当数组作为形参传入函数中,长度:num2 == %d\n\n", num2); //实参a 和形参a的数据类型本质不一样 //形参中的数组,编译器会把它当作指针处理(c语言特色) for(i = 0; i < num; i++) //冒泡排序 { for(j = 0; j < num; j++) { if(a[i] > a[j]) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } } //return a; } //数组做函数参数的返回问题,返回为一个指针 //把数组的内存首地址和数组的有效长度传给被调用函数 int main() { int num = 0; int a[] = {1, 0, 3, 6, 8, 6, 9}; num = sizeof(a) / sizeof(a[0]); printf(" num == %d\n", num); printf("排序之前:"); printfArray(a, num); sortArray(a, num); printf("排序之后:"); printfArray(a, num); printf("Hello world!\n"); return 0; }
我们可以看到,无论是以哪一种作为形参传入函数(a[], *a, a[x]),在函数内部所得到的数据长度
都为1,换句话说,我们传入函数的仅仅是指向数组首地址的一个指针而已。
为什么要这么做呢?其实换一个角度也许会好理解些: c语言相比于其他语言的特点有:能通过指
针直接对内存进行操作,运行速度快等;那么如果我真要传一个数组进去,自然程序运行速度就会
有所下降。