“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

本文作者: Foxny

更新记录: 2021.7.18

勘误记录: 某一处数组内存图标错数字(鸣谢:小雪山飞狐)

本文声明: 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

指针笔试题(答案+详解)

说明:

① 建议做题时拿出纸和笔写出你认为的结果;

② 建议先把答案遮住(不小心看到也没事),看看你哪里想错了,重要的不是结果;

③ 对于做错的题,可以看题目答案下面的解析部分,以便深入理解;

第一题:

下列程序运行后的结果是什么?

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int* ptr = (int*)(&a + 1);
    printf("%d,%d", *(a + 1), *(ptr - 1));

    return 0;
}

本题答案:

2,5

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第二题:

  假设 p 的值为 0x100000,如下表达式的值分别为多少?

    (已知结构体 Test 类型的变量大小为 20 个字节)

// 由于还没有学习结构体,这里告知结构体大小是20个字节
struct Test
{
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;

int main()
{
    printf("%p\n", p + 0x1);
    printf("%p\n", (unsigned long)p + 0x1);
    printf("%p\n", (unsigned int*)p + 0x1);

    return 0;
}

本题答案:

00000014
00000001
00000004

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第三题:

下列程序运行后的结果是什么?

int main()
{
	int a[4] = { 1,2,3,4 };
	int* ptr1 = (int*) (&a + 1);
	int* ptr2 = (int*) ((int)a + 1);

	printf("%x, %x", ptr1[-1], *ptr2);

	return 0;
}

本题答案:

4, 2000000

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

 第四题:

下列程序运行后的结果是什么?

int main()
{
	int a[3][2] = { (0, 1), (2, 3),(4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);

	return 0;
}

本题答案:

1

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第五题:

下列程序运行后的结果是什么?

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]);

	return 0;
}

  本题答案:

FFFFFFFC, -4

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第六题:

下列程序运行后的结果是什么?

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));
    return 0;
}

  本题答案:

10, 5

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第七题:

下列程序运行后的结果是什么?

int main()
{
    char* a[] = { "work", "at", "alibaba" };
    char** pa = a;
    pa++;
    printf("%s\n", *pa);

    return 0;
}

  本题答案:

at

详细解析:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

第八题:

下列程序运行后的结果是什么?

int main()
{
    char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
    char**cp[] = {c+3, c+2, c+1, c};
    char***cpp = cp;

    printf("%s\n", **++cpp);
    printf("%s\n", *--*++cpp+3);
    printf("%s\n", *cpp[-2] + 3);
    printf("%s\n", cpp[-1][-1] + 1);

    return 0;
}

  本题答案:

POINT
ER
ST
EW

解题思路图:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

彩蛋:

《“ 祖安猎码人”在线手撕代码画图解析【C指针笔试题】》

本篇完

    原文作者:王亦优 foxny
    原文地址: https://blog.csdn.net/weixin_50502862/article/details/118880091
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞