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 ", b[3]);  //这里输出的结果是什么? b只有3个元素,而我们这里输出第四个元素。结果输出还是 99

再来看

printf("a[0] is : %i ", 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 ", arr[i]); } }

上面的代码打印后将无法输出正确的结果。 因为 sizeof(arr[])将永远等于8。

原文地址:https://www.cnblogs.com/aleafo/p/5379994.html