【维生素C语言】画图解析C语言指针笔试题

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

前言:

C语言指针笔试题,建议做完后再看答案。本篇博客有详细的解析部分,对每一道题进行深度的画图解析。如果你想复习下指针再来做,可以进入下面的传送门:


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

📚 说明:

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

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

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


第一题:

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

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

🔑 详细解析:( 图画错了,是 int a[5] = {1,2,3,4,5} )


第二题:

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

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

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

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

    return 0;
}

💡 本题答案:

00000014
00000001
00000004

🔑 详细解析:


第三题:

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

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

🔑 详细解析:


第四题:

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

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

	return 0;
}

💡 本题答案:

1

🔑 详细解析:


第五题:

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

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p, %d
", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

	return 0;
}

💡 本题答案:

FFFFFFFC, -4

🔑 详细解析:


第六题:

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

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

🔑 详细解析:


第七题:

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

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

    return 0;
}

💡 本题答案:

at

🔑 详细解析:


第八题:

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

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

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

    return 0;
}

💡 本题答案:

POINT
ER
ST
EW

🔑 解题思路图:


彩蛋:


参考资料:

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

比特科技. C语言进阶[EB/OL]. 2021[2021.8.31]. .

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

本篇完。

经验分享 程序员 微信小程序 职场和发展