笔试题目一
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
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯
版权声明:本文为meihaoshy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。