在做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语言相比于其他语言的特点有:能通过指
针直接对内存进行操作,运行速度快等;那么如果我真要传一个数组进去,自然程序运行速度就会
有所下降。