首先我们要知道:
sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名表示整个数组
下来我们看看一堆练习吧
一、
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 + 1));// 4 下一个数组的地址 printf("%d\n", sizeof(&a[0])); //4 首元素地址 printf("%d\n", sizeof(&a[0] + 1));//4 第二个元素的地址 printf("%d\n", sizeof(*&a)); //16 整个数组 system("pause"); return 0;
二、字符数组
char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%d ", sizeof(a)); //6 整个数组大小 printf("%d ", sizeof(a + 0)); //4 首元素的地址 =&a[0] printf("%d ", sizeof(a[1])); //1 第二个元素 printf("%d ", sizeof(&a)); // 4 整个数组的地址,数值上和首元素地址相同 printf("%d ", sizeof(&a + 1));// 4 下一个同类型数组的地址 printf("%d ", sizeof(&a[0] + 1));//4 第二个元素的地址
printf("%d ", strlen(a)); //>6 一个随机值 假设为10 printf("%d ", strlen(a + 0)); // 10 //printf("%d ", strlen(a[1])); //出错 strlen是char * 而a[1]是char 类型不匹配 //printf("%d ", strlen(&a)); // 10 会出现告警,这里是数组指针,但数值一样 //printf("%d ", strlen(*a)); //出错 类型不匹配 printf("%d ", strlen(&a + 1));// 10-6=4 下一个数组的长度 printf("%d ", strlen(&a[0] + 1));//10-1=9
这里编译的时候,随机值为19
三、
char *a = "abcdef"; // 默认为'\0'结束 printf("%d ", sizeof(a)); //4 printf("%d ", sizeof(a + 1)); //4 printf("%d ", sizeof(*a)); //1 printf("%d ", sizeof(a[0])); //1 printf("%d ", sizeof(&a)); // 4 printf("%d ", sizeof(&a + 1));// 4 printf("%d ", sizeof(&a[0] + 1));//4
printf("%d ", strlen(a)); //6 printf("%d ", strlen(a + 1)); // 5 //printf("%d ", strlen(a[0])); //出错 char!=char* printf("%d ", strlen(&a)); // 随机值 //printf("%d ", strlen(*a)); //出错 类型不匹配 printf("%d ", strlen(&a + 1));// 随机值 printf("%d ", strlen(&a[0] + 1));//5
四、二维数组
int a[3][4] = { 0 }; printf("%d ", sizeof(a)); //48 printf("%d ", sizeof(a[0][0])); //4 第一个元素(数组)的第一个元素 printf("%d ", sizeof(a[0])); //16 第一个元素,是一维数组 printf("%d ", sizeof(a[0]+1)); // 4 a[0]第一个元素,也就是数组名+1 就是第一个元素里面的第二个元素的地址。 printf("%d ", sizeof(a+1)); // 4 下一个数组(数组)的地址 printf("%d ", sizeof(*a)); // 16 第一个元素(数组) printf("%d ", sizeof(&a[0] + 1));//4 下一个元素(数组)的地址 printf("%d ", sizeof(a[3])); //16 第四个元素(数组),具有访问权限