指针进阶
//一维数组
int a[] = {1,2,3,4};
//一维数组
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
//size_t strlen(const char *string);strlen的参数为const char *string
printf("%d\n", strlen(arr));//随机数,len
printf("%d\n", strlen(arr + 0));//随机数,len
printf("%d\n", strlen(*arr));//char,参数类型不匹配
printf("%d\n", strlen(arr[1]));//char,参数类型不匹配
printf("%d\n", strlen(&arr));//char(*)[6],,在不同的编译器下警告或者报错,随机数,len
printf("%d\n", strlen(&arr + 1));//char(*)[6],在不同的编译器下警告或者报错,随机数
printf("%d\n", strlen(&arr[0] + 1));//随机数,;len-1
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//数组名单独存在代表整个数组,使用""初始化时后面会加'\0',7
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));//字符串的长度,不包含'\0',6
printf("%d\n", strlen(arr + 0));//字符串的长度,不包含'\0',6
printf("%d\n", strlen(*arr));//类型不匹配
printf("%d\n", strlen(arr[1]));//类型不匹配
printf("%d\n", strlen(&arr));//报错或者警告,数组的地址,也是代表从第一个开始找到'\0'结束,6
printf("%d\n", strlen(&arr + 1));//报错或者警告,下一个数组的地址,找到'\0',随机数
printf("%d\n", strlen(&arr[0] + 1));//第二个元素的地址,找到'\0',5
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针p的大小,4
printf("%d\n", sizeof(p + 1));//指针p下一个地址的大小,4
printf("%d\n", sizeof(*p));//指针p所指向内容第一个元素的大小,1
printf("%d\n", sizeof(p[0]));//第一个元素的大小,1
printf("%d\n", sizeof(&p));//指针p的地址,4
printf("%d\n", sizeof(&p + 1));//指针p的地址的下一个地址,4
printf("%d\n", sizeof(&p[0] + 1));//第二个元素的地址,4
printf("%d\n", strlen(p));//指针所指向内容的长度,6
printf("%d\n", strlen(p + 1));//指针所指向内容从第二个元素起到'\0'的长度,5
printf("%d\n", strlen(*p));//p的第一个元素,类型不匹配
printf("%d\n", strlen(p[0]));//p的第一个元素,类型不匹配
printf("%d\n", strlen(&p));//指针p的地址,随机数
printf("%d\n", strlen(&p + 1));//指针p的地址的下一块内存的地址,随机数
printf("%d\n", strlen(&p[0] + 1));//指针所指向内容从第二个元素起到'\0'的长度,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]));//a[0]相当于第一个数组的数组名,第一个元素的大小,16
printf("%d\n", sizeof(a[0] + 1));//a[0]相当于第一个数组的数组名,第一个元素中的第二个元素的地址的大小,4
printf("%d\n", sizeof(*(a[0] + 1)));//第一个元素中的第二个元素的大小,4
printf("%d\n", sizeof(a + 1));//a代表第一个元素的地址,a+1是第二个元素的地址,4
printf("%d\n", sizeof(*(a + 1)));//第二个元素大小,16
printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址,4
printf("%d\n", sizeof(*(&a[0] + 1)));//第二个元素,16
printf("%d\n", sizeof(*a));//a代表首元素的地址,16
printf("%d\n", sizeof(a[3]));//越界但不报错,可以读取,16