3个重要的点
1,数组名单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2,&数组名,数组名表示整个数组,取出的是数组的地址。
3,除此之外,所有遇到的数组名都表示数组首元素的地址。
#include <stdio.h>
#include <string.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));
//16,计算的是整个数组的大小。
printf("%d\n", sizeof(&a + 1));
//4,计算的是下一个数组的地址的大小。
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", sizeof(arr));
//6,整个数组的大小。
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,指向下一个数组的地址的大小。
printf("%d\n", sizeof(&arr[0] + 1));
//4,第二个元素的地址的大小。
printf("%d\n", strlen(arr));
//x,strlen是遇到'\0'停止计算,该数组中没有\0。
printf("%d\n", strlen(arr + 0));
//x,同上
//printf("%d\n", strlen(*arr));
//err,strlen计算的是地址。
//printf("%d\n", strlen(arr[1]));
//err,同上
printf("%d\n", strlen(&arr));
//x,没有遇到\0。
printf("%d\n", strlen(&arr + 1));
//x-6,从f的位置开始向后数。
printf("%d\n", strlen(&arr[0] + 1));
//x-1,从b的位置开始向后数。
char arr[] = "abcdef";
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,计算的是下一个数组的地址的大小。
printf("%d\n", sizeof(&arr[0] + 1));
//4,计算的是第二个元素的地址的大小。
printf("%d\n", strlen(arr));
//6,计算整个数组的大小,到'\0'停止。
printf("%d\n", strlen(arr + 0));
//6,同上。
//printf("%d\n", strlen(*arr));
//strlen计算的是地址。
//printf("%d\n", strlen(arr[1]));
//err,同上
printf("%d\n", strlen(&arr));
//6,起始位置向后数。
printf("%d\n", strlen(&arr + 1));
//x,从'\0'后面开始数。
printf("%d\n", strlen(&arr[0] + 1));
//5,从b的位置开始向后数。
char *p = "abcdef";
printf("%d\n", sizeof(p));
//4,p是个指针变量,里面存的是一个地址。
printf("%d\n", sizeof(p + 1));
//4,b的地址。
printf("%d\n", sizeof(*p));
//1,a的地址在p里面存着。
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,b的地址。
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));
//x,从p的位置向后数。
printf("%d\n", strlen(&p + 1));
//x,从p+1的位置向后数。
printf("%d\n", strlen(&p[0] + 1));
//5,从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,第一行的数组名单独放在sizeof内部,表示的是整个数组的大小,计算的是第一行元素的大小。
printf("%d\n", sizeof(a[0] + 1));
//4,第一行的数组名没有单独放在sizeof内部,a[0]表示的是首元素的地址,计算的是第一行第二个元素的大小。
printf("%d\n", sizeof(a + 1));
//4,计算的是第二行的地址的大小。
printf("%d\n", sizeof(&a[0] + 1));
//4,第二行的地址。
printf("%d\n", sizeof(*a));
//16,a为第一行的地址,第一行元素的大小。
printf("%d\n", sizeof(a[3]));
//16,第4行元素的大小。
printf("%d\n", sizeof(*(a[0] + 1)));
//4,计算的是第一行,第二个元素的大小。
printf("%d\n", sizeof(*(a + 1)));
//16,第二行元素的大小。
printf("%d\n", sizeof(*(&a[0] + 1)));
//16,第二行元素的大小。
return 0;
}
总结
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名表示整个数组。
&数组名,这里的数组名表示整个数组。
如有不足之处,欢迎指正!!