今天看了一些有关数组的计算题,大致总结如下,希望各位看过以后,对数组能够有更好的理解:
一、数组名代表整个数组的两种情况:
- sizeof(数组名)
- &数组名
二、例题
//一维数组
int arr[] = {1, 2, 3, 4};
printf("%d\n", sizeof(arr)); // arr 表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(arr + 0)); // arr+0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr)); // *arr 表示数组首元素---4
printf("%d\n", sizeof(arr + 1)); // arr+1 表示数组第二个元素的地址---4
printf("%d\n", sizeof(arr[1])); // arr[1] 表示数组第二个元素---4
printf("%d\n", sizeof(&arr)); // &arr 表示整个数组的地址---4
printf("%d\n", sizeof(*&arr)); // *&arr 表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(&arr + 1)); // &arr 表示整个数组的地址,&arr+1 表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0])); // &arr[0] 表示数组首元素的地址---4
printf("%d\n", sizeof(&arr[0] + 1)); // &arr[0] + 1 表示数组第二个元素的地址---4
//字符数组
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", sizeof(arr)); // arr 表示整个数组,计算的是整个数组的字节大小---6
printf("%d\n", sizeof(arr + 0)); // arr + 0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr)); // *arr 表示数组首元素---1
printf("%d\n", sizeof(arr[1])); // arr[1] 表示数组第二个元素---1
printf("%d\n", sizeof(&arr)); // &arr 表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1)); // &arr 表示整个数组的地址,&arr+1 表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1)); // &arr[0] + 1 表示数组第二个元素的地址---4
printf("%d\n", strlen(arr)); // 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(arr + 0)); // 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(*arr)); // *arr 表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1])); // arr[1] 表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr)); // 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(&arr + 1)); // 跳过整个数组,从'f'后面开始数,'f'的后面未知---随机值,与上一个差6
printf("%d\n", strlen(&arr[0] + 1)); // 从'b'开始数,'f'的后面未知---随机值,与上上一个差1
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); // arr 表示整个数组,计算的是整个数组的字节大小,其中该数组包含'\0'---7
printf("%d\n", sizeof(arr + 0)); // arr+0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr)); // *arr 表示首元素---1
printf("%d\n", sizeof(arr[1])); // arr[1] 表示数组第二个元素---1
printf("%d\n", sizeof(&arr)); // &arr 表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1)); // 跳过整个数组,整个数组后面(即'\0'后面)那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1)); // &arr[0]+1 表示数组第二个元素的地址---4
printf("%d\n", strlen(arr)); // 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(arr + 0)); // 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(*arr)); // *arr 表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1])); // arr[1] 表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr)); // 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(&arr + 1)); // 跳过整个数组,从'\0'后开始数,'\0'的后面未知---随机值
printf("%d\n", strlen(&arr[0] + 1)); // 从'b'开始数,'f'的后面遇见'\0'---5
char* p = "abcdef";
printf("%d\n", sizeof(p)); // p 是一个指针变量,为一个地址---4
printf("%d\n", sizeof(p + 1)); // p+1 是'b'的地址---4
printf("%d\n", sizeof(*p)); // p 是一个字符指针,解引用后就是一个字符---1
printf("%d\n", sizeof(p[0])); // p[0] <--> *(p+0) <--> *p---1
printf("%d\n", sizeof(&p)); // &p 是p的地址---4
printf("%d\n", sizeof(&p + 1)); // 跳过p,p后面那段空间的起始地址---4
printf("%d\n", sizeof(&p[0] + 1)); // &p[0]+1 是'b'的地址---4
printf("%d\n", strlen(p)); // 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(p + 1)); // 从'b'开始数,'f'的后面遇见'\0'---5
printf("%d\n", strlen(*p)); // size_t strlen(const char *string);---error
printf("%d\n", strlen(p[0])); // size_t strlen(const char *string);---error
printf("%d\n", strlen(&p)); // 与字符串无关,p是一个变量,从p开始往后数,直到遇见'\0'---随机值
printf("%d\n", strlen(&p + 1)); // 与字符串无关,p是一个变量,从p后面开始往后数,直到遇见'\0'---随机值,与上面差4
printf("%d\n", strlen(&p[0] + 1)); // 从'b'开始数,'f'的后面遇见'\0'---5
//二维数组
int arr[3][4] = {0};
printf("%d\n", sizeof(arr)); // arr 表示整个数组,计算的是整个数组的字节大小---48
printf("%d\n", sizeof(arr[0][0])); // arr[0][0] 表示整个数组的第一个元素(int)---4
printf("%d\n", sizeof(arr[0])); // arr[0] 是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组---16
printf("%d\n", sizeof(arr[0] + 1)); // arr[0] 是有4个元素的一维数组首元素的地址,则arr[0]+1 是一维数组第二个元素的地址---4
printf("%d\n", sizeof(arr + 1)); // arr 是二维数组首元素(有4个元素的一维数组)的地址,则arr+1 是下一个一维数组的地址---4
printf("%d\n", sizeof(&arr[0] + 1)); // &arr[0] 是二维数组首元素(有4个元素的一维数组)的地址,则&arr[0]+1 是下一个一维数组的地址---4
printf("%d\n", sizeof(*arr)); // *arr 表示二维数组首元素(有4个元素的一维数组)的所有元素---16
printf("%d\n", sizeof(arr[3])); // 不用访问,由类型(一维数组)可得---16