解释说明:每一条语句后面的就是测出来的运行结果,下面是原因解释:
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));//16
//数组名放在sizeof里表示整个数组
printf("%d\n", sizeof(a + 0));//4
//首元素a[0]地址
printf("%d\n", sizeof(*a));//4
//首元素大小
printf("%d\n", sizeof(a + 1));//4
//第二个元素a[1]地址
printf("%d\n", sizeof(a[1]));//4
//a[1]元素大小
printf("%d\n", sizeof(&a));//4
//首元素地址的地址
printf("%d\n", sizeof(&a + 1));//4
//首元素地址的地址加1,跳过整个数组
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
//首元素地址的地址+1
printf("%d\n", sizeof(&arr + 1));//4
//首元素地址的地址+1,跳过整个数组
printf("%d\n", sizeof(&arr[0] + 1));//4
//第二个元素地址
//
printf("%d\n", strlen(arr));//19
//没有结尾的‘\0’,随机产生
//printf("%d\n", strlen(arr + 0));//19
//没有结尾的‘\0’,随机产生
// printf("%d\n", strlen(*arr));//无法输出
//访问首元素地址的地址,传参错误,应该为char*实际为char,不是地址,发生访问冲突
// printf("%d\n", strlen(arr[1]));//无输出
//访问第二个元素,,参数类型错误,应该位char*实际为char,不是地址,出现访问冲突
printf("%d\n", strlen(&arr));//19
//没有结尾的‘\0’,随机产生,访问首元素地址的地址
printf("%d\n", strlen(&arr + 1));//13
//没有结尾的‘\0’,随机产生,访问首元素地址的地址加1跳过整个数组
printf("%d\n", strlen(&arr[0] + 1));//18
//没有结尾的‘\0’,随机产生,访问第二个元素地址
char *p = "abcdef";//后面有一个隐藏的‘\0’
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
//计算首元素地址的地址+1的大小(跳过整个数组)
printf("%d\n", sizeof(&p[0] + 1));//4
//计算第二个元素地址大小
printf("%d\n", strlen(p));//6
//表示字符串长度(到‘\0’结束)
printf("%d\n", strlen(p + 1));//5
//从第二个元素开始求字符串长度
// printf("%d\n", strlen(*p));//...
//需要参数是char*实际为char,不是地址,访问冲突
// printf("%d\n", strlen(p[0]));//...
//同上
printf("%d\n", strlen(&p));//随机数
//从首元素地址的地址开始计算字符串长度,是一个随机值,
printf("%d\n", strlen(&p + 1));//随机数
从首元素地址的地址下一位(跳过整个数组)开始计算字符长度,是一个随机值
printf("%d\n", strlen(&p[0] + 1));//5
//从第二个元素开始计算整个字符串的长度
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
//计算第一行的大小,二维数组可以看成若干个一位数组,a[0]表示第一行
//这个小数组的数组首元素地址,可以表示整个第一行
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
//计算第一行的大小
printf("%d\n", sizeof(a[3]));//16
//计算数组后面空间的大小(整个数组之后)
return 0;
}