有关数组的运算:
- 一维数组
int a[] = {1,2,3,4}; //定义含有4个元素的整形数组
1.printf("%d\n",sizeof(a));
//sizeof(a)此时a代表整个数组,sizeof求出整个数组的大小。输出为:16
2.printf("%d\n",sizeof(a+0));
//此处a不再代表整个数组,而是代表数组首元素的地址,地址的大小为4个字节,所以输出为:4
3.printf("%d\n",sizeof(*a));
//此处a不再代表整个数组,而是代表数组首元素的地址,等价于int型指针,解引用后相当于int类型,所以输出为:4
4.printf("%d\n",sizeof(a+1));
//此处同2题解,不同的是此时(a+1)指向数组的第二个元素。所以此处输出:4
5.printf("%d\n",sizeof(a[1]));
//a[1]的类型为整形,所以此处输出:4
6.printf("%d\n",sizeof(&a));
//当“&数组名”时,数组名代表整个数组,所以&a代表整个数组的‘地址’为int(*)[4]类型。输出也为:4
7.printf("%d\n",sizeof(&a+1));
//“&a”代表整个数组的地址 +1等同跳过了整个数组,此时(&a+1)指向数组后的下个元素
8.printf("%d\n",sizeof(&a[0]));
//a[0]为int型,取址后为int *类型,指针类型大小均为4个字节;所以此处输出:4
9.printf("%d\n",sizeof(&a[0]+1));
//同8,此时(&a[0]+1)指向a[1]元素。
- 字符数组
char arr[] = {'a','b','c','d','e','f'};//数组大小为6个char类型
1.printf("%d\n", sizeof(arr));
//arr代表整个数组大小,所以此处输出:6
2.printf("%d\n", sizeof(arr+0));
//此处arr代表数组首元素地址,偏移0个元素后仍然指向首元素。
3.printf("%d\n", sizeof(*arr));
//此处arr代表数组首元素地址,解引用后为char类型,输出为:1
4.printf("%d\n", sizeof(arr[1]));
//(arr[1])为char类型,输出为:1
5.printf("%d\n", sizeof(&arr));
//(&arr)代表整个数组的地址,指针均为4个字节大小,所以输出:4
6.printf("%d\n", sizeof(&arr+1));
//(&arr+1),(&arr)代表整个数组的地址,+1后偏移整个数组大小,指针大小为4,输出为:4
7.printf("%d\n", sizeof(&arr[0]+1));
//&arr[0]为char *类型 +1偏移一个字节大小,指针大小为4,输出为:4
8.printf("%d\n", strlen(arr));
//因为arr数组中没有'\0',所以此处输出随机值。
9.printf("%d\n", strlen(arr+0));
//结果同8,不过此处(arr+0)为char *类型
10.printf("%d\n", strlen(*arr));
//(*arr)代表数组首元素,把arr[0]当作地址去求字符串的长度,程序会挂掉
11.printf("%d\n", strlen(arr[1]));
//同10,将arr[1]当作地址去求字符串的长度,程序会挂掉
12.printf("%d\n", strlen(&arr));
//(&arr)代表整个数组的地址,因为arr数组中没有'\0',所以此处输出随机值。
13.printf("%d\n", strlen(&arr+1));
//(&arr)代表整个数组的地址,+1后跳过整个数组指向后面的元素,结果与12的结果相差6
14.printf("%d\n", strlen(&arr[0]+1));
//(&arr[0]+1)指向arr[1],所以结果比8的结果少1
- 常量字符串
char *p = "abcdef";
1.printf("%d\n", sizeof(p));
//p为char *类型,所以输出:4
2.printf("%d\n", sizeof(p+1));
//(p+1)为char *类型,所以输出:4
3.printf("%d\n", sizeof(*p));
//*p为char类型,输出:1
4.printf("%d\n", sizeof(p[0]));
//(p[0]) == 'a',所以结果同上。
5.printf("%d\n", sizeof(&p));
//(&p)为char **类型,输出仍为4
6.printf("%d\n", sizeof(&p+1));
//(&p+1)为char **类型,输出仍为4
7.printf("%d\n", sizeof(&p[0]+1));
//(&p[0]+1)为char *类型,输出为:4
8.printf("%d\n", strlen(p));
//"abcdef"定义的常量字符串存储时会在后面加上'\0'所以输出为:6
9.printf("%d\n", strlen(p+1));
//输出为:5
10.printf("%d\n", strlen(*p));
//将'a'当作地址去求字符串的长度程序会挂掉。
11.printf("%d\n", strlen(p[0]));
//同上
12.printf("%d\n", strlen(&p));
//"&p"为char **类型,此程序代表从p的地址开始求字符串的长度,输出随机值
13.printf("%d\n", strlen(&p+1));
//同上,+1后偏转char *(4个字节)的大小,所以结果比12的结果小4
14.printf("%d\n", strlen(&p[0]+1));
//同9
- 二维数组
int a[3][4] = {0};
1.printf("%d\n",sizeof(a));
//a代表整个数组大小,所以输出:48
2.printf("%d\n",sizeof(a[0][0]));
//(a[0][0])为int 型,所有输出;4
3.printf("%d\n",sizeof(a[0]));
//a[0]代表一个int [4]类型的数组名,所以输出:16
4.printf("%d\n",sizeof(a[0]+1));
//(a[0]+1)等同a[0][1]的地址,所以输出:4
5.printf("%d\n",sizeof(a+1));
//(a+1)代表a[1]的地址,所以输出:4
6.printf("%d\n",sizeof(&a[0]+1));
//同上
7.printf("%d\n",sizeof(*a));
//*a等价a[0]整个数组,所以输出:16
8.printf("%d\n",sizeof(a[3]));
//代表a[3]整个数组,所以输出:16,不过此处a[3]数组并不存在,sizeof仅仅是求类型的大小,所以不会出错。
总结:
数组名代表整个数组的时候只有两种情况:
- sizeof(数组名);//这里的数组名代表整个数组。
- &数组名,//这里的数组名代表整个数组。
本文详细解析了一维数组、字符数组、常量字符串及二维数组在不同运算符作用下的表现,包括sizeof与strlen函数在各种场景中的应用,帮助读者深入理解数组在C语言中的使用。

被折叠的 条评论
为什么被折叠?



