指针和数组中sizeof和strlen的相关笔试题

it2023-09-05  76

重点:

数组名表示首元素的地址,但是有两个例外: (1)sizeof(数组名),数组名表示整个数组,计算的是数组的总大小,单位是字节。 (2)&数组名,数组名表示整个数组,取出的是整个数组的地址。 (3)除(1)(2)之外,所有遇到的数组名都表示的是数首元素的地址。

int main() { //一维数组 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 }

注意:strlen 内部需要接收一个地址

//字符数组 int main() { 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 printf("%d\n", strlen(arr));//随机值,不能确定何处取到'\0' printf("%d\n", strlen(arr + 0));//随机值 printf("%d\n", strlen(*arr));//err printf("%d\n", strlen(arr[1]));//err printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值 printf("%d\n", strlen(&arr[0] + 1));//随机值 char arr[] = "abcdef"; printf("%d\n", sizeof(arr));//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));//6 printf("%d\n", strlen(arr + 0));//6 printf("%d\n", strlen(*arr));//err printf("%d\n", strlen(arr[1]));//err printf("%d\n", strlen(&arr));//6,传进去首元素的地址,从首元素开始数 printf("%d\n", strlen(&arr + 1));//随机值 printf("%d\n", strlen(&arr[0] + 1));//5 char *p = "abcdef"; printf("%d\n", sizeof(p));//p为一个指针变量,4个字节 printf("%d\n", sizeof(p + 1));//4 printf("%d\n", sizeof(*p));//1 printf("%d\n", sizeof(p[0]));//1 p[0] == *(p+0) printf("%d\n", sizeof(&p));//4 printf("%d\n", sizeof(&p + 1));//4 printf("%d\n", sizeof(&p[0] + 1));//4 printf("%d\n", strlen(p));//6 printf("%d\n", strlen(p + 1));//5 printf("%d\n", strlen(*p));//err printf("%d\n", strlen(p[0]));//err printf("%d\n", strlen(&p));//随机值 printf("%d\n", strlen(&p + 1));//随机值 printf("%d\n", strlen(&p[0] + 1));//5

对于二维数组而言,a[0]代表第一行元素的地址。

//二维数组 int a[3][4] = { 0 }; printf("%d\n", sizeof(a));//12*4=48 printf("%d\n", sizeof(a[0][0]));//4 printf("%d\n", sizeof(a[0]));//相当于第一行的数组名,计算整行的大小 4*4=16 printf("%d\n", sizeof(a[0] + 1));// = 4,相当于(数组名+1),不是特殊情况,即计算第一行第二个元素大小。 printf("%d\n", sizeof(*(a[0] + 1)));//4 printf("%d\n", sizeof(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));//16 printf("%d\n",sizeof(a[3]));//16
最新回复(0)