鱼C论坛

 找回密码
 立即注册
查看: 2686|回复: 5

[已解决]求助3道c语言指针这一块的选择题

[复制链接]
发表于 2020-5-8 14:15:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
三道选择题
第一题
p【4】是一个结构体数组
->指向运算符之前要用指针 为什么p可以用指向运算符呢 他不是一个结构体数组名吗[
attachimg]126645[/attachimg]
第二题
这个表达式到底要我求的是什么 看不懂
(int * )q- (int * p)
16]AQE`64RNJ%Q_DX`4MQ@U.png
第三题
17.已知某函数内有声明:int  a[3][3], (*ptr)[3]=a, *p=a; ,则能正确引用数组元素a[1][2]的是(        )。
A.*(++ptr)[2]       B.*(++p+2)       C.*(*++ptr+2)       D.*(*++a+2)
答案选c
但是我认为ac是一样的
a的括号展开不就是c嘛
acd感觉都是对的,就知道b是错的
最佳答案
2020-5-8 20:53:22
1. 查一下 数据和指针的关系(数据变量名,可以当作指针使用)

2. 涉及第一题指针与数据的关系,也涉及了指针的步长,指针类型转换
    a. 数据变量名就是数组的首地址, 数据名加一 (s + 1) 等价于 (&s[1]) 取第一个元素的地址
    b. 指针步长与指针类型相关,等于指针指向变量类型的大小。比如,32位机器,long 类型指针的步长为4Byte, 64位机器 long 指针步长为8byte
    c. 题目将 struct 的指针转成了 int* (整形的指针), 指针类型的转换,影响的是解析指针的方式(寻址,内存对齐等)
  综上所述,题目就是有一个包含两个整形的结构体,然后获取两个指针,相隔的步长为1,然后将这两个指针转换成整型的指针,此时相减,因为类型从两个整形变成了一个整形类型,所以步长变成了原来的一半,所以结果的 1(原来相差的步长) * 2(步长缩小的倍数)

3. 自己分析
A{09$A60Q~J6HF0}7SB3V38.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-8 20:53:22 | 显示全部楼层    本楼为最佳答案   
1. 查一下 数据和指针的关系(数据变量名,可以当作指针使用)

2. 涉及第一题指针与数据的关系,也涉及了指针的步长,指针类型转换
    a. 数据变量名就是数组的首地址, 数据名加一 (s + 1) 等价于 (&s[1]) 取第一个元素的地址
    b. 指针步长与指针类型相关,等于指针指向变量类型的大小。比如,32位机器,long 类型指针的步长为4Byte, 64位机器 long 指针步长为8byte
    c. 题目将 struct 的指针转成了 int* (整形的指针), 指针类型的转换,影响的是解析指针的方式(寻址,内存对齐等)
  综上所述,题目就是有一个包含两个整形的结构体,然后获取两个指针,相隔的步长为1,然后将这两个指针转换成整型的指针,此时相减,因为类型从两个整形变成了一个整形类型,所以步长变成了原来的一半,所以结果的 1(原来相差的步长) * 2(步长缩小的倍数)

3. 自己分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 11:58:55 | 显示全部楼层
好的谢谢 第一第二题都懂了
第三题 还是不懂 下面是我的分析
ptr是一个指向二维数组的指针 p是一个一级指针
A选项 ++ptr 代表 ptr指向了二维数组a【1】 也就是第二行的首地址 且【2】说明是第二个元素 与题目相符
B选项 p是一级指针指向二维数组首地址++p 代表是的 a【0】【1】再加2 代表的是a【0】【3】 错误
C选项 与A选项一致 ++ptr指向a【1】 后面+2则指向a【1】【2】  与题目相符
D选项 a是二维数组首地址 数组名好像不能进行自增运算 所以d错误

最后答案是c 我不知道ac有什么区别 还要请教大佬
d选项我的分析正确吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 12:00:01 | 显示全部楼层
赚小钱 发表于 2020-5-8 20:53
1. 查一下 数据和指针的关系(数据变量名,可以当作指针使用)

2. 涉及第一题指针与数据的关系,也涉及了 ...

好的谢谢 第一第二题都懂了
第三题 还是不懂 下面是我的分析
ptr是一个指向二维数组的指针 p是一个一级指针
A选项 ++ptr 代表 ptr指向了二维数组a【1】 也就是第二行的首地址 且【2】说明是第二个元素 与题目相符
B选项 p是一级指针指向二维数组首地址++p 代表是的 a【0】【1】再加2 代表的是a【0】【3】 错误
C选项 与A选项一致 ++ptr指向a【1】 后面+2则指向a【1】【2】  与题目相符
D选项 a是二维数组首地址 数组名好像不能进行自增运算 所以d错误

最后答案是c 我不知道ac有什么区别 还要请教大佬
d选项我的分析正确吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 16:35:56 | 显示全部楼层
KrisWang 发表于 2020-5-9 12:00
好的谢谢 第一第二题都懂了
第三题 还是不懂 下面是我的分析
ptr是一个指向二维数组的指针 p是一个一级 ...

我分析不出来,因为我几年没写c了。
我的直觉告诉我应该和运算符优先级有关(* 解引用 与 + 指针计算)。
不同的优先级会导致做指针计算的时候,指针的类型不一样,也就是步长不一样。

PS: 作为一个工作过一段时间的人,给你一些建议,研究这些没用,能毕业就行。有这个时间,不如把操作系统,数据结构,算法,网络,数据库,这些学好。

如果有更多的精力,去参加开源社区。

以上,祝好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 17:40:09 | 显示全部楼层
赚小钱 发表于 2020-5-9 16:35
我分析不出来,因为我几年没写c了。
我的直觉告诉我应该和运算符优先级有关(* 解引用 与 + 指针计算)。
...

好的 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表