不积跬步,无以至千里 数组是C中非常简单的概念,但个中细节还是值得总结一二,如下 参考书目
《C语言深度剖析》《C++primer》以及
Write by 张鹏霄, zpx736312737@126.com显式:
int arr[] = {1,2,3}; int arr[3] = 0; const unsigned sz = 3; int arr[sz] = {1,2,3}误用案例:
char a[6] = "hahaha";//没有空间存放空字符数组在内存的存储被分为两部分:数组名与数组元素:
数组名作为一种特殊变量(引用类型),被存在栈中;数组元素作为数组的实际变量存在堆中;不同于int i = 1;中i是变量名,1是变量的值,数组的元素没有名字(a[x]不是变量名);数据的访问通过数组名解引用得到数组首元素的地址,其后元素可用指针或下标的形式访问。数组与指针在使用中常被混淆 《C语言深度剖析》中明确指出:指针与数组是两个完全不同的数据类型
指针在32位系统下永远只占4byte,其值为某一内存的地址;数组大小由数组元素类型及个数决定,可以存除函数外的任意类型数据。指针与数组常常被混淆的一个原因是:两者都可以使用指针、下标的形式去访问数据 char *p = "abcdef";此时*(p+4)与p[4]都可以访问到字符 ‘e’;char p[] = "abcdef";此时*(p+4)与p[4]都可以访问到字符 ‘e’。关于数组名在一些少见的情况下有几点需要强调
sizeof(a)中a被作为数组名(引用类型变量)处理(未被解引用),其它情况会被解析为首元素地址 int a[] = {1, 2, 3, 4}; printf("%d\n",sizeof(a));//16 对数组名(引用类型数据)其大小受元素类型与个数影响 printf("%d\n",sizeof(*a));//4 *a为首元素地址 printf("%d\n",sizeof(a[1]));//4 第二个元素的地址 printf("%d\n",sizeof(&a));//4 对数组名(引用类型数据)解引用后结果为首元素的地址初始化
int a1[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0};//后两个元素为0 int a3[3][4] = {{1, 2}, {4, 5}, {6, 7,}};//后两列元素为0 printf("%d\n",a3[0][0]);//1对于
int a1[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; a[0][3]向后偏移一个元素为a[1][0],即多维数组在内存中“线性存储”。 因此,多维数组的访问(指针与下标)可以参考一维数组。数组的拷贝、其它易理解的知识点不在本文讨论范围之内。