1.一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//此时计算的是整个数组的大小,为4*4,即16
printf("%d\n",sizeof(a+0));
//a+0此时代表了a数组首元素的地址,地址一般为4字节或者8字节
printf("%d\n",sizeof(*a));
//*a代表了数组首元素1,故结果为4
printf("%d\n",sizeof(a+1));
//a+1代表数组中第二个元素的地址,既然是地址,为4或8
printf("%d\n",sizeof(a[1]));
//数组第二个元素2,结果为4
printf("%d\n",sizeof(&a));
//4或8
printf("%d\n",sizeof(*&a));
//*与&相互抵消,相当于a,计算的是整个数组的大小,16
printf("%d\n",sizeof(&a+1));
//&的优先级大于+,故输出为跳过数组的第一位地址,4或8
printf("%d\n",sizeof(&a[0]));
//首元素地址,4或8
printf("%d\n",sizeof(&a[0]+1));
//地址。4或8
2.字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//得到数组大小,6
printf("%d\n", sizeof(arr+0));
//地址4或8
printf("%d\n", sizeof(*arr));
//首元素,1
printf("%d\n", sizeof(arr[1]));
//第二个元素,1
printf("%d\n", sizeof(&arr));
//地址,4或8
printf("%d\n", sizeof(&arr+1));
//地址,4或8
printf("%d\n", sizeof(&arr[0]+1));
//地址,4或8
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));
//错误,strlen是通过地址来寻找的
printf("%d\n", strlen(arr[1]));
//错误,strlen是通过地址来寻找的
printf("%d\n", strlen(&arr));
//随机,没有遇到\0
printf("%d\n", strlen(&arr+1));
//随机,没有遇到\0
printf("%d\n", strlen(&arr[0]+1));
//随机,没有遇到\0
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
//7个元素,包含\0,得到7
printf("%d\n", sizeof(arr+0));
//地址,4或8
printf("%d\n", sizeof(*arr));
//首元素a,1
printf("%d\n", sizeof(arr[1]));
//第二个元素b,1
printf("%d\n", sizeof(&arr));
//地址,4或8
printf("%d\n", sizeof(&arr+1));
//地址,4或8
printf("%d\n", sizeof(&arr[0]+1));
//地址,4或8
int main()
{
char* p = "abcdef";
printf("%zd\n", strlen(p));
//6
printf("%zd\n", strlen(p + 1));
//5
//printf("%zd\n", strlen(*p));
//err,报错,需要地址,而非元素
//printf("%zd\n", strlen(p[0]));
//p[0]--*(p+0)-->*p //err,类型冲突
printf("%zd\n", strlen(&p));
//随机值
printf("%zd\n", strlen(&p + 1));
//随机值
printf("%zd\n", strlen(&p[0] + 1));//5
return 0;
}
3.二维数组
int a[3][4]= { 0 };
printf("%zd\n", sizeof(a));
//12*4 = 48个字节, 数组名单独放在sizeof内部
printf("%zd\n", sizeof(a[0][0]));
//4
printf("%zd\n", sizeof(a[0]));
//a[0]是第一行这个一维数组的数组名, 数组名单独放在sizeof内部了
//计算的是第一行的大小,单位是字节, 16个字节
printf("%zd\n", sizeof(a[0] + 1));
//a[0]第一行这个一维数组的数组名,这里表示数组首元素
//也就是a[0][0]的地址, a[0] + 1是a[0][1]的地址
printf("%zd\n", sizeof(*(a[0] + 1)));
//a[0][1] - 4个字节
printf("%zd\n", sizeof(a + 1));
//a是二维数组的数组名, 但是没有&, 也没有单独放在sizeof内部
//所以这里的a是数组收元素的地址, 应该是第一行的地址,a+1是第二行的地址
//大小也是4/8 个字节
printf("%zd\n", sizeof(*(a+ 1)));
//*(a + 1) ==> a[1] - 第二行的数组名, 单独放在sizeof内部,计算的是第二行的大小
//16个字节
printf("%zd\n", sizeof(&a[0] + 1));
//&a[0]是第一行的地址,&a[0]+1就是第二行的地址,4/8
printf("%zd\n", sizeof(*(&a[0] + 1)));
//访问的是第二行, 计算的是第二行的大小, 16个字节
//int(*p)[4] = &a[0] + 1;
printf("%zd\n", sizeof(*a));
//这里的a是第一行的地址, *a就是第一行,512eof(xa)计算的是第一行的大小-16
//*a --> *(a+0) --> a[0]|
printf("%zd\n", sizeof(a[3]));
//这里不存在越界
//因为sizeof内部的表达式不会真实计算的
//计算的是第四行的大小-16
希望大家好好研究,不管期末还是笔试还是林林总总的比赛啥的,都是易考点哦。