数组是C语言中一个非常重要的概念,数组运算有许多陷阱。
一维字符数组
#include<stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+0));//4 相当于字符'a'地址
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
return 0;
}
一维数字数组
#include<stdio.h>
int main()
{ int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16
printf("%d\n",sizeof(a+0));//4
printf("%d\n",sizeof(*a));//4
printf("%d\n",sizeof(a+1));//4
printf("%d\n",sizeof(a[1]));//4
printf("%d\n",sizeof(&a));//4
printf("%d\n",sizeof(&a+1));//4 跳过一个数组的长度
printf("%d\n",sizeof(&a[0]));//4
printf("%d\n",sizeof(&a[0]+1));//4 相当于a[1]
return 0;
//数组地址和首元素地址一样,但是+1的意义不同
}
指针与一维数组
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
//sizeof()里的表达式预编译就已经处理,表达式不执行
//strlen()向后面找'\0'
char *p = "abcdef";
printf("%d\n", sizeof(p));//4 指针
printf("%d\n", sizeof(p+1));//4 指针
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4
printf("%d\n", sizeof(&p+1));//4
printf("%d\n", sizeof(&p[0]+1));//4
printf("%d\n", strlen(*p));//error
printf("%d\n", strlen(p[0]));//error
printf("%d\n", strlen(&p));//error
printf("%d\n", strlen(&p+1));//error
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
printf("%d\n", strlen(&p[0]+1));//5
return 0;
}
二维数组
#include<stdio.h>
int main()
{
int a[3][4] = {0};
printf("%d\n",a+1);
printf("%d\n",sizeof(a));//48
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4 相当于a[0][1]
printf("%d\n",sizeof(a+1));//4 相当于地址
printf("%d\n",sizeof(&a[0]+1));//4
printf("%d\n",sizeof(*a));//16 以a[0][0]为首元素的一维数组
printf("%d\n",sizeof(a[3]));//16 预编译
return 0;
}
总结:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组。
&数组名,这里的数组名表示整个数组。