1. 整型
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
//4*4=16
printf("%d\n", sizeof(a + 0));
//数组名是首元素地址,a+0还是首元素的地址,地址的大小 4/8
printf("%d\n", sizeof(*a));
//数组名a是首元素的地址,*a是首元素,大小是4个字节
printf("%d\n", sizeof(a + 1));
//数组名a是数组首元素的地址,a+1是第二个元素的地址,地址大小是4/8
printf("%d\n", sizeof(a[1]));
//第二个元素的大小就是4个字节
printf("%d\n", sizeof(&a));
//&a是数组的地址,数组的地址也是地址,是地址4/8个字节
printf("%d\n", sizeof(*&a));
//整个数组,16个字节
printf("%d\n", sizeof(&a + 1));
//&a+1相对于&a是跳过了整个数组,即使跳过了整个数组,&a+1依然是地址,地址是4/8个字节
printf("%d\n", sizeof(&a[0]));
//首元素的地址,4/8个字节
printf("%d\n", sizeof(&a[0]+1));
//&a[0]是首元素的地址,&a[0]+1就是第二个元素的地址,是地址就是4/8个字节
2.字符型
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//数组名单独放在sizeof内部,这里的arr是整个数组的大小,单位是字节,总共6个字节
printf("%d\n", sizeof(arr + 0));
//arr+0首元素地址,地址大小4/8个字节
printf("%d\n", sizeof(*arr));
//arr是首元素的地址,*arr就是首元素,大小1个字节
printf("%d\n", sizeof(arr[1]));
//arr[1]就是第二个元素,大小1个字节
printf("%d\n", sizeof(&arr));
//&arr数组的地址,是地址大小4/8个字节
printf("%d\n", sizeof(&arr+1));
//*arr+1是跳过整个数组后的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));
//第二个元素的地址,是地址就是4/8个字节
char arr[] = "abcdef";//[a b c d e f \0]
printf("%d\n", sizeof(arr));
// 7个字节
printf("%d\n", sizeof(arr + 0));
// 首元素地址 4/8字节
printf("%d\n", sizeof(*arr));
//首元素 1字节
//*arr == *(arr+0) == arr[0]
printf("%d\n", sizeof(arr[1]));
//第二个元素 1字节
printf("%d\n", sizeof(&arr));
//数组的地址,4/8个字节
printf("%d\n", sizeof(&arr+1));
//&arr+1跳过一个数组的地址,4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));
//第二个元素的地址,4/8个字节
//strlen 是库函数
//求字符串长度,统计的是字符串 \0 之前的字符个数
//没有 \0 就会一直向后找
printf("%d\n", strlen(arr));
//随机值
printf("%d\n", strlen(arr + 0));
//随机值
printf("%d\n", strlen(*arr));
// strlen传参需要的是一个地址,*arr是数组首元素,就是'a'= 97。则将97作为地址传参
//strlen 就会从97这个地址开始统计字符串长度,这就非法访问内存
printf("%d\n", strlen(arr[1]));
//同上
printf("%d\n", strlen(&arr));
//&arr是数组的地址,类型char(*)[6],与strlen 函数传参char *str
//数组的地址与数组首元素的地址值是一样的
//随机值
printf("%d\n", strlen(&arr + 1));
//跳过整个数组,随机值
printf("%d\n", strlen(&arr[0] + 1));
//从第二个元素向后统计,随机值
char arr[] = "abcdef";//[a b c d e f \0]
printf("%d\n", strlen(arr));
//6个字符
printf("%d\n", strlen(arr + 0));
//6个字符
printf("%d\n", strlen(*arr));
//error,字符 a
printf("%d\n", strlen(arr[1]));
//error
printf("%d\n", strlen(&arr));
//char(*)[6] 转化成 char* ,数值相同,6个字符
printf("%d\n", strlen(&arr+1));
//跳过\0,随机值
printf("%d\n", strlen(&arr[0] + 1));
//5个字符
3. 指针型
char* p = "abcdef";//[a b c d e f \0], p存放 a 的地址
printf("%d\n", sizeof(p));
// p是指针变量,4/8个字节
printf("%d\n", sizeof(p + 1));
// p+1指向b,大小4/8个字节
printf("%d\n", sizeof(*p));
// 首元素,大小是1个字节
printf("%d\n", sizeof(p[0]));
// 首元素,大小是1个字节
printf("%d\n", sizeof(&p));
// &p -> char** 二级指针,大小是1个字节
printf("%d\n", sizeof(&p + 1));
//&p + 1 指向p的尾部 大小是4/8个字节
printf("%d\n", sizeof(&p[0] + 1));
// 指向b,大小4/8个字节
return 0;
char* p = "abcdef";//[a b c d e f \0], p存放 a 的地址
printf("%d\n", strlen(p));
// 6个字符
printf("%d\n", strlen(p + 1));
// 5个字符
printf("%d\n", strlen(*p));
// error,*p -> a ,非法内存访问
printf("%d\n", strlen(p[0]));
// error,*p -> a ,非法内存访问 *(p+0)
printf("%d\n", strlen(&p));
// 随机值
printf("%d\n", strlen(&p + 1));
// 随机值
printf("%d\n", strlen(&p[0] + 1));
// 随机值
4. 二维数组
int a[3][4] = { 0 }; // 3行4列
printf("%d\n",sizeof(a));
// 3 * 4 * 4 = 48 字节
printf("%d\n",sizeof(a[0][0]));
// 4 字节
printf("%d\n", sizeof(a[0]));
// 对于二维数组 a 来说,a[0] 就是第一行这个一维数组的数组名
// a[1] 就是第二行这个一维数组的数组名
// a[2] 就是第三行这个一维数组的数组名
// 数组名单独放在sizeof内部,计算整个数组的大小 16 字节
printf("%d\n", sizeof(a[0] + 1));
// a[0]作为第一行的数组名,没有单独放在sizeof内部,没有 & 取地址
// a[0]表示数组首元素的地址,也就是a[0][0]的地址
// a[0] + 1 是第一行第二个元素的地址,地址4/8字节
printf("%d\n", sizeof(*(a[0] + 1)));
// 第一行第二个元素的大小
printf("%d\n", sizeof(a + 1));
// a是数组首元素的地址,是第一行的地址 int(*)[4]
// a+1就是第二行的地址,地址4/8字节
printf("%d\n", sizeof(*(a + 1)));
// *(a + 1) -> a[1],计算的是第二行的大小
// a + 1 ->是第二行的地址,int(*)[4],解应用访问的是第二行的数组
printf("%d\n", sizeof(&a[0] + 1));
// 第二行的地址,地址4/8字节
printf("%d\n", sizeof(*(&a[0]+1)));
// 计算的是第二行的大小 16字节
printf("%d\n", sizeof(*a));
// a是数组首元素的地址,就是第一行的地址
// *a就是第一行,16字节
// *a -> *(a+0) -> a[0]
printf("%d\n", sizeof(a[3]));
// a[3] -> int [4]
// sizeof 只关注类型
//16字节
return 0;
5. sizeof
//编译 + 链接 -> 可执行程序 -> 运行 -> 结果
//表达式:
// 1. 值属性
// 2. 类型属性