首先必须明白数组名代表整个数组只有两种情况:
1,sizeof(数组名),数组名代表整个数组。意思是取整个数组大小,单位是字节。
2,&数组名,取出的是整个数组地址。
3,除此之外,所有遇到数组都代表首元素地址。
下面看题:
一维数组,
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));//16整个数组的大小,单位是字节
printf("%d\n",sizeof(&a+1));//4取出数组后面下一个数组的地址,跳过16字节
printf("%d\n",sizeof(&a[0]));//4首元素地址
printf("%d\n",sizeof(&a[0]+1));//4第二个元素地址
字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//随机值 无\0无法停下
printf("%d\n", strlen(arr+0));//随机值 无\0无法停下
//printf("%d\n", strlen(*arr));//err 访问传递a的ANSI值97地址值出现冲突
//printf("%d\n", strlen(arr[1]));//err 传递b的ANSI值98地址值出现冲突
printf("%d\n", strlen(&arr));//随机值 从a往后数无\0无法停下
printf("%d\n", strlen(&arr+1));//随机值-6 从f往后数无\0无法停下
printf("%d\n", strlen(&arr[0]+1));//随机值-1 从b往后数无\0无法停下
printf("%d\n", sizeof(arr)); //6 数组元素的大小
printf("%d\n", sizeof(arr+0));//4 首元素地址
printf("%d\n", sizeof(*arr)); //1 首元素的大小(char)
printf("%d\n", sizeof(arr[1]));//1 第二个元素的大小
printf("%d\n", sizeof(&arr));//4 整个数组的地址
printf("%d\n", sizeof(&arr+1));//4取出下一个数组的地址 f的后面
printf("%d\n", sizeof(&arr[0]+1));//4 第二个元素地址
字符串
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//6 从a往后数
printf("%d\n", strlen(arr+0));//6 从a往后数
//printf("%d\n", strlen(*arr));// err
//printf("%d\n", strlen(arr[1]));// err
printf("%d\n", strlen(&arr));//6 从a往后数
printf("%d\n", strlen(&arr+1));//随机值 取出下一个数组的地址跳过6
printf("%d\n", strlen(&arr[0]+1));//5 从b开始
printf("%d\n", sizeof(arr));//7 数组大小包括\0
printf("%d\n", sizeof(arr+0));//4 首元素地址
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 取出下一个数组的地址跳过7
printf("%d\n", sizeof(&arr[0]+1));//4 第二个元素地址
char *p = "abcdef";
printf("%d\n", strlen(p));//6 从a开始
printf("%d\n", strlen(p+1));//5 从b开始
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//随机值 从p的地址往后数
printf("%d\n", strlen(&p+1));//随机值 从p的地址下一个往后数
printf("%d\n", strlen(&p[0]+1));//5 从B开始
printf("%d\n", sizeof(p));//4(指针变量)a的地址
printf("%d\n", sizeof(p+1));//4 b的地址
printf("%d\n", sizeof(*p));//1 解引用a的地址 a的大小(char) 首元素
printf("%d\n", sizeof(p[0]));//1首元素
printf("%d\n", sizeof(&p));//4 p的地址
printf("%d\n", sizeof(&p+1));//4 跳过了p
printf("%d\n", sizeof(&p[0]+1));//4 b的地址
二维数组
int a[3][4] = {0};
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第一行第二个元素地址
printf("%d\n",sizeof(a+1));//4第二行地址
printf("%d\n",sizeof(&a[0]+1));4第二行地址
printf("%d\n",sizeof(*a));//16第一行大小 二维数组首元素地址就是第一行地址
printf("%d\n",sizeof(a[3]));//16仅仅计算第四行大小
return 0;
}