c语言学习笔记 —— 数组
1. 数组的内存分配原理。
数组定义 int a[3] = {1,3,11};
如下写法是错误的:
int number;
int a[number] = {1,7,9};
原因是:没有定长的数组初始化的时候,由于计算机不知道该分配多少空间给它,因此初始化会失败!
如下的写法虽然也可以运行,但是结果不是我们期望的。
int a[2] = {3,7};
int b[3] = {22,33,18};
b[3] = 99;
printf("b[3] is : %i\n", b[3]); //这里输出的结果是什么? b只有3个元素,而我们这里输出第四个元素。结果输出还是 99
再来看
printf("a[0] is : %i\n", a[0]); //这里输出的结果是什么,猜猜看?
上面的输出结果我们发现a[3]变成了99,这是为什么呢?
因为数组作为一个变量在内存中也是从高到低存储的,但是数组元素却是按照从低到高排列在该数组所占的存储空间中。所以上面的b[3]挤占了 数组a中的第一个元素。如下图所示:
地址 数组变量 数组元素地址 数组元素值
0ffc19
0ffc20
0ffc21 数组b b[0] 88
0ffc22 b[1] 33
0ffc23 b[2] 22
0ffc24 数组a a[1] 7(b[3]的修改导致这里被修改)
0ffc25 a[0] 3
2. 参数传递给形参为数组的函数的时候,传递的是数组的地址,因此数组的元素个数是可以省略的。
因此,主要是看形参
3. 数组作为形参会自动转换为指针,而指针在64位系统中占8个字节,也就是说无法在函数中通过传入的形参数组来计算数组的长度,必须将数组长度作为单独的参数进行传递。
例如
int a[3] = {1,2,3};
void printArray(arr[]){ int len = sizeof(arr[]) / sizeof(arr[0]); for (int i = 0; i < len; i ++){ printf("The nth eleme is : %i\n", arr[i]); } }
上面的代码打印后将无法输出正确的结果。 因为 sizeof(arr[])将永远等于8。