C语言笔记10:sizeof和strlen,指针与数组题目
数组和指针笔试题
数组和指针笔试题这里都是64位环境
题目一
c//#include <stdio.h> // //int main() //{ // // int a[] = { 1,2,3,4 }; // printf("%d\n", sizeof(a));//16 // printf("%d\n", sizeof(a + 0));//8 // printf("%d\n", sizeof(*a));//4 // printf("%d\n", sizeof(a + 1));//8 // printf("%d\n", sizeof(a[1]));//4 // printf("%d\n", sizeof(&a));//8 // printf("%d\n", sizeof(*&a));//16 // printf("%d\n", sizeof(&a + 1));//8 // // printf("%d\n", sizeof(&a[0]));//8 // printf("%d\n", sizeof(&a[0] + 1));//8 // return 0; //}
题目二
c//#include <stdio.h> // //int main() //{ // char arr[] = { 'a','b','c','d','e','f' }; // printf("%d\n", sizeof(arr));//6 // printf("%d\n", sizeof(arr + 0));//8 // printf("%d\n", sizeof(*arr));//1 // printf("%d\n", sizeof(arr[1]));//1 // printf("%d\n", sizeof(&arr));//8 // printf("%d\n", sizeof(&arr + 1));//8 // printf("%d\n", sizeof(&arr[0] + 1));//8 // // return 0; //}
题目三
c//#include <stdio.h> //#include <string.h> // //int main() //{ // char arr[] = { 'a','b','c','d','e','f' }; // printf("%d\n", strlen(arr));//未知数。 // printf("%d\n", strlen(arr + 0));//未知数 // printf("%d\n", strlen(*arr));//未知数 // printf("%d\n", strlen(arr[1]));//未知数 // printf("%d\n", strlen(&arr));//未知数 // printf("%d\n", strlen(&arr + 1));//未知数 // printf("%d\n", strlen(&arr[0] + 1));//未知数 // // return 0; //}
题目四
c//#include <stdio.h> // //int main() //{ // char arr[] = "abcdef"; // printf("%d\n", sizeof(arr));//7 // printf("%d\n", sizeof(arr + 0));//8 // printf("%d\n", sizeof(*arr));//1 // printf("%d\n", sizeof(arr[1]));//1 // printf("%d\n", sizeof(&arr));//8 // printf("%d\n", sizeof(&arr + 1));//8 // printf("%d\n", sizeof(&arr[0] + 1));//8 // return 0; //}
题目五
c//#include <stdio.h> //#include <string.h> //int main() //{ // char arr[] = "abcdef"; // printf("%d\n", strlen(arr));//6 // printf("%d\n", strlen(arr + 0));//6 // printf("%d\n", strlen(*arr));//未知数 // printf("%d\n", strlen(arr[1]));//未知数 // printf("%d\n", strlen(&arr));//未知数 // printf("%d\n", strlen(&arr + 1));//未知数 // printf("%d\n", strlen(&arr[0] + 1));//5 // return 0; //}
题目六
c//#include <stdio.h> // //int main() //{ // char* p = "abcdef"; // printf("%d\n", sizeof(p));//8 // printf("%d\n", sizeof(p + 1));//8 // printf("%d\n", sizeof(*p));//1 // printf("%d\n", sizeof(p[0]));//1 // printf("%d\n", sizeof(&p));//8 // printf("%d\n", sizeof(&p + 1));//8 // printf("%d\n", sizeof(&p[0] + 1));//8 // // return 0; //}
题目七
c//#include <stdio.h> //#include <string.h> // //int main() //{ // char* p = "abcdef"; // printf("%d\n", strlen(p));//6 // printf("%d\n", strlen(p + 1));//5 // //printf("%d\n", strlen(*p));//未知数 // //printf("%d\n", strlen(p[0]));//未知数 // //printf("%d\n", strlen(&p));//未知数 // //printf("%d\n", strlen(&p + 1));//未知数 // printf("%d\n", strlen(&p[0] + 1));//5 // // return 0; //}这里粗心了一下,把strlen(p+1)算成6了
题目八
c//#include <stdio.h> // //int main() //{ // 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]));//16 // printf("%d\n", sizeof(a[0] + 1));//8 // printf("%d\n", sizeof(*(a[0] + 1)));//4 // printf("%d\n", sizeof(a + 1));//8 // printf("%d\n", sizeof(*(a + 1)));//16 // printf("%d\n", sizeof(&a[0] + 1));//8 // printf("%d\n", sizeof(*(&a[0] + 1)));//16 // printf("%d\n", sizeof(*a));//16 // printf("%d\n", sizeof(a[3]));//16 // // return 0; //}这里不小心把
sizeof(*(&a[0] + 1))算成48了
指针运算笔试题
题目一
c//#include <stdio.h> //int main() //{ // int a[5] = { 1, 2, 3, 4, 5 }; // int* ptr = (int*)(&a + 1); // printf("%d,%d", *(a + 1), *(ptr - 1));//2,5 // return 0; //}
题目二
c//在X86环境下 //假设结构体的⼤⼩是20个字节 //程序输出的结果是啥? //#include <stdio.h> // //struct Test //{ // int Num; // char* pcName; // short sDate; // char cha[2]; // short sBa[4]; //}*p = (struct Test*)0x100000; // //int main() //{ // printf("%p\n", p + 0x1);//0x100014 // printf("%p\n", (unsigned long)p + 0x1);//0x100001 // printf("%p\n", (unsigned int*)p + 0x1);//0x100004 // return 0; //}
题目三
c//#include <stdio.h> //int main() //{ // int a[3][2] = { (0, 1), (2, 3), (4, 5) };//拿括号初始化而不是大括号。 // int* p; // p = a[0]; // printf("%d", p[0]);//1 // return 0; //}这里的坑是一维数组是使用圆括号初始化的
题目四
c//假设环境是x86环境,程序输出的结果是啥? //#include <stdio.h> //int main() //{ // int a[5][5]; // int(*p)[4]; // p = a; // printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//(19 - 23) = -16->-0x4,-4; // //-4以地址形式打印会是什么呢?4字节无符号整数0xFFFFFFFF是-1,0xFFFFFFFC // return 0; //}地址是一个无符号整数。
题目五
c//#include <stdio.h> //int main() //{ // int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // int* ptr1 = (int*)(&aa + 1); // int* ptr2 = (int*)(*(aa + 1)); // printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5 // return 0; //}
题目六
c#include <stdio.h> int main() { char* a[] = { "work","at","alibaba" }; char** pa = a; pa++; printf("%s\n", *pa);//at return 0; }示意图如下

题目七
c#include <stdio.h> int main() { char* c[] = { "ENTER","NEW","POINT","FIRST" }; char** cp[] = { c + 3,c + 2,c + 1,c }; char*** cpp = cp; printf("%s\n", **++cpp);//POINT printf("%s\n", *-- * ++cpp + 3);//ER printf("%s\n", *cpp[-2] + 3);//ST printf("%s\n", cpp[-1][-1] + 1);//EW return 0; }第二个
*-- * ++cpp + 3要小心优先级,先算++,再算*
EW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);//POINT
printf("%s\n", *-- * ++cpp + 3);//ER
printf("%s\n", *cpp[-2] + 3);//ST
printf("%s\n", cpp[-1][-1] + 1);//EW
return 0;
}
第二个`*-- * ++cpp + 3`要小心优先级,先算`++`,再算`*`
