笔试题目一
int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }
题目分析
1首先a代表的是数组首元素的地址 加上一就是代表的2的地址
对其解引用就可以得到2这个元素
2 而ptr拿到的是整个数组的地址再加一 所以指向五后面一个元素
而随后又被强转成int类型的指针了 所以移动的范围变成了一个元素
所以说 最后向前移动一位 变成指向元素5
所以说 最终的结果是2 5
笔试题目二
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); p是一个指针 指针的大小是20 所以这个时候应该是加上20 变成0x100014 printf("%p\n", (unsigned long)p + 0x1); 这里是变成一个整型 实际上加上的数字就是1 所以应该变成0x100001 printf("%p\n", (unsigned int*)p + 0x1); 这里变成一个int类型的指针 所以应该变成 0x100004 return 0; }
我们首先要明确 0x1是一个十六进制数字1
答案如下
笔试题目三
int main() { int a[4] = { 1, 2, 3, 4 }; int *ptr1 = (int *)(&a + 1); 首先取地址a是取出整个数组的地址 加上1之后指针指向4 所以说指向4后面一个元素 所以说ptrl{-1}应该是指向4 int *ptr2 = (int *)((int)a + 1); 下面这个我们就要画图来解释了 printf( "%x,%x", ptr1[-1], *ptr2); return 0; }
要求上面代码输出的结果
这个时候指针指向的00 我们读取一下这个数据的内存
答案应该是02 00 00 00
笔试题目四
要求以下程序的输出结果
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int *p; p = a[0]; printf( "%d", p[0]); return 0; }
这个其实是一个逗号表达式 里面真正的内容应该是 1 3 5 0 0 0
输出的结果应该是第一行首元素 应该是1
笔试题目五
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)); 这里首先aa是首元素地址 再二维数组中就是第一行的地址 加上1之后变成 printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; }
所以说 输出的结果是十 五
笔试题目六
int main() { char* a[] = { "work","at","alibaba" }; char** pa = a; pa++; printf("%s\n", *pa); return 0; }
这里首先a是一个指针数组
里面的每一个元素其实都是一个指针
用pa来接受a这个数组的首元素地址 其实也就是work的地址
pa++之后 指向at 这个指针
所以说打印出来的结果是at
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯