7

【这些题我一拿到手就会】C指针和数组试题详解(下)

 2 years ago
source link: https://blog.csdn.net/weixin_50614301/article/details/123536559
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【这些题我一拿到手就会】C指针和数组试题详解(下)

大猩猩! 于 2022-03-19 20:45:29 发布 3954
分类专栏: C语言进阶 文章标签: c语言

本章接着奏乐接着舞(刷题),祖传手法(图文结合)带你入土(bushi)。
在这里插入图片描述
📌温馨提示:建议自我检测,先做一遍,再校对答案,如此食用,甚是美味!
📌对于还没学习指针知识的同学,我只能仙人指路:
【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;
}

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述

📚考点:

指针类型决定指针±整数的步长(跳过几个字节)。


问题: 假设 p 的值为 0x100000。 下面表达式的值分别为多少?
(由于还没有学习结构体,这里告知结构体Test类型大小是20个字节)

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;

int main()
{
	p = (struct Test*)0x100000;
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}
newCodeMoreWhite.png

💯答案:

在这里插入图片描述

🔑解析:

%p:打印指针的值,即指针存放的地址

1️⃣
在这里插入图片描述 2️⃣
在这里插入图片描述

3️⃣
在这里插入图片描述

📚 考点:

1.指针±整数
2.强制类型转换,指针被强转为整型,会把指针的值看作是一个整数


问题: 下面程序输出什么?

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;
}

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述

📚考点:

1.小端字节序方式存储
2.指针类型决定指针±整数的步数(跳过几个字节)
3.指针所指向的类型决定编译器看待指针所指向内存区的方式


❓:下面程序输出什么?

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

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述

📚考点:

逗号表达式的应用


问题: 下面程序输出什么?

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;
}

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述

📚考点:

指针类型、指针所指向的类型、指针 - 指针、整数以补码形式存储在计算机内存…


问题: 下面程序输出什么?

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;
}

💯答案:

在这里插入图片描述

🔑解析:

笔试题6和笔试题3非常相似
在这里插入图片描述

📚考点:

二维数组数组名、指针类型


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

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述

📚考点:

字符指针指向字符串首字符

🔱心得:

存放多串字符串,可以用到字符指针数组


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;
}

💯答案:

在这里插入图片描述

🔑解析:

在这里插入图片描述++cpp:cpp自增,会改变cpp ;cpp-2,cpp-1:并不会改变cpp

📚考点:

一级指针、二级指针、指针数组、对指针的高度理解


写文和制图不易,恳请各位铁汁们点赞收藏评论加关注,你们的支持是我坚持的动力~

(附:CSDN社区 《创作达人》活动,只要参与其中并创作文章就有机会获得官方奖品:精品日历、新程序员杂志,快来参与吧!链接直达https://bbs.csdn.net/topics/605272551)

补: 博主想拿个小礼品,请大家高抬贵手点个赞呗~
在这里插入图片描述


本章是关于指针和数组的笔试题,对指针的掌握要求较高
如果你遇到难点,可以查阅:
【C语言入门必看】指针
【详解C语言指针】我真的让C指针给我唱征服了~乌拉
【这些题我一拿到手就会】指针和数组笔试题详解(上)
【C语言教程 | 菜鸟教程】

✒️ 笔者:陈汉新

📅 更新: 2022.3.19

❌ 勘误: 暂无

📣 声明:由于作者水平有限,本文错误之处在所难免,敬请读者指正!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK