1.以下代码的运行结果是什么
char arr1[] = { 'a','b','c','d','e','f' };
printf("sizeof(arr1) = %zd bytes \n", sizeof(arr1));
printf("sizeof(arr1 + 0) = %zd bytes \n", sizeof(arr1 + 0));
printf("sizeof(*arr1) = %zd bytes \n", sizeof(*arr1));
printf("sizeof(arr1[1]) = %zd bytes \n", sizeof(arr1[1]));
printf("sizeof(&arr1) = %zd bytes \n", sizeof(&arr1));
printf("sizeof(&arr1 + 1) = %zd bytes \n", sizeof(&arr1 + 1));
printf("sizeof(&arr1[0] + 1) = %zd bytes \n", sizeof(&arr1[0] + 1));
1.答案:
以下是在64位系统中的运行结果
sizeof(arr1) = 6 bytes ,表示的是整个数组的大小,6个字节
sizeof(arr1 + 0) = 8 bytes ,第一个元素指针 ,64位系统为8个字节,32位系统为4个字节
sizeof(*arr1) = 1 bytes ,第一个元素 1个字节
sizeof(arr1[1]) = 1 bytes ,第二个元素 1个字节
sizeof(&arr1) = 8 bytes ,整个数组的地址,按照指针来计算
sizeof(&arr1 + 1) = 8 bytes ,跳到了整个数组后边的位置,不建议这么用,但结果是个指针
sizeof(&arr1[0] + 1) = 8 bytes ,第二个元素的地址,是个指针
2.以下代码的运行结果是什么
char arr2[] = "abcdef";
printf("sizeof(arr2) = %zd bytes \n", sizeof(arr2));
printf("sizeof(arr2 + 0) = %zd bytes \n", sizeof(arr2 + 0));
printf("sizeof(*arr2) = %zd bytes \n", sizeof(*arr2));
printf("sizeof(arr2[1]) = %zd bytes \n", sizeof(arr2[1]));
printf("sizeof(&arr2) = %zd bytes \n", sizeof(&arr2));
printf("sizeof(&arr2 + 1) = %zd bytes \n", sizeof(&arr2 + 1));
printf("sizeof(&arr2[0] + 1) = %zd bytes \n", sizeof(&arr2[0] + 1));
2.答案:
以下为64位的系统中的结果
sizeof(arr2) = 7 bytes ,字符串的大小,因为arr2定义的时候会自动在后边加上‘/0’,为7
sizeof(arr2 + 0) = 8 bytes ,这么写变成了数组的指针
sizeof(*arr2) = 1 bytes ,取了arr2的第一个元素,结果为1
sizeof(arr2[1]) = 1 bytes ,取了arr2的第二个元素,结果为1
sizeof(&arr2) = 8 bytes ,取了数组的地址,计算指针的大小即可
sizeof(&arr2 + 1) = 8 bytes ,跳到数组后边的位置,但还是指针
sizeof(&arr2[0] + 1) = 8 bytes,第二个元素的指针
3.以下代码的运行结果是什么
char* p = "abcdef";
printf("sizeof(p) = %zd bytes \n", sizeof(p));
printf("sizeof(p + 1) = %zd bytes \n", sizeof(p + 1));
printf("sizeof(*p) = %zd bytes \n", sizeof(*p));
printf("sizeof(p[0]) = %zd bytes \n", sizeof(p[0]));
printf("sizeof(&p) = %zd bytes \n", sizeof(&p));
printf("sizeof(&p + 1) = %zd bytes \n", sizeof(&p + 1));
printf("sizeof(&p[0] + 1) = %zd bytes \n", sizeof(&p[0] + 1));
3.答案:
以下结果为64位系统的结果
sizeof(p) = 8 bytes ,按照指针来计算
sizeof(p + 1) = 8 bytes ,跳到第二个元素的位置,即b的位置,但是个指针
sizeof(*p) = 1 bytes ,取第一个元素,为char类型
sizeof(p[0]) = 1 bytes ,取第一个元素
sizeof(&p) = 8 bytes ,取了指针的地址,也是个指针
sizeof(&p + 1) = 8 bytes ,跳过p指针的地址,还是个指针,但是指向了未知的位置
sizeof(&p[0] + 1) = 8 bytes,取了第一个元素的位置,然后跳转到第二个元素的指针
4.以下代码的运行结果是什么
int arr3[3][4] = { 0 };
printf("sizeof(arr3) = %zd bytes \n", sizeof(arr3));
printf("sizeof(arr3[0][0]) = %zd bytes \n", sizeof(arr3[0][0]));
printf("sizeof(arr3[0]) = %zd bytes \n", sizeof(arr3[0]));
printf("sizeof(arr3[0] + 1) = %zd bytes \n", sizeof(arr3[0] + 1));
printf("sizeof(*(arr3[0] + 1)) = %zd bytes \n", sizeof(*(arr3[0] + 1)));
printf("sizeof(arr3 + 1) = %zd bytes \n", sizeof(arr3 + 1));
printf("sizeof(*(arr3 + 1)) = %zd bytes \n", sizeof(*(arr3 + 1)));
printf("sizeof(&arr3[0] + 1) = %zd bytes \n", sizeof(&arr3[0] + 1));
printf("sizeof(*(&arr3[0] + 1)) = %zd bytes \n", sizeof(*(&arr3[0] + 1)));
printf("sizeof(*arr3) = %zd bytes \n", sizeof(*arr3));
printf("sizeof(arr3[3]) = %zd bytes \n", sizeof(arr3[3]));
4.答案:
以下结果是64位的系统中运行的
sizeof(arr3) = 48 bytes ,整个的数组的大小,为3*4*4
sizeof(arr3[0][0]) = 4 bytes ,取了第一行第一列的元素,int类型
sizeof(arr3[0]) = 16 bytes ,第一行数组的大小,为4*4
sizeof(arr3[0] + 1) = 8 bytes ,第一行数组的的第二个元素的地址,是个指针
sizeof(*(arr3[0] + 1)) = 4 bytes ,取了上边这个元素的数据,为int型
sizeof(arr3 + 1) = 8 bytes ,跳到数组的第二行的首位置,是个指针,相当于arr3[1]
sizeof(*(arr3 + 1)) = 16 bytes ,取了第二行的数组,是个一维数组,4*4
sizeof(&arr3[0] + 1) = 8 bytes ,取了首行的地址,然后跳到第二行的位置,为指针
sizeof(*(&arr3[0] + 1)) = 16 bytes ,第二行的位置解引用,为一维数组,4*4
sizeof(*arr3) = 16 bytes ,arr3为首行地址,解引用会变为一维数组,4*4
sizeof(arr3[3]) = 16 bytes,第4行的数组的大小,为4*4