鱼C论坛

 找回密码
 立即注册
查看: 5282|回复: 14

书上的关于指针的一条选择题

[复制链接]
发表于 2013-6-17 23:52:05 | 显示全部楼层 |阅读模式
10鱼币
假设指针变量p以被正确定义,下列(  )语句是不正确的?

A: p = &x;                     B:    p = &(x+1);
C :   p = &x=1;                 D:   p = &x++;

通过编译器知道  B 是错的,不过不知道为什么是错了,我觉得4个好像都正确啊!
希望好心人解答,并解释下原因!谢谢!

最佳答案

查看完整内容

计算机中有很多的“临时变量”,它们没有名字,如 int a = 5; a+1就可以认为是这类“临时变量”,因为它没有名字,所以它的生存周期很短,所以一般不能够对这类变量取地址(它的存储和正常变量的存储不一样),所以p = &(x+1);中&(x+1)是错误的 此外,int x = 5; &x也是“临时变量”,这些临时变量也是不能赋值的,所以&x=1是错的了,所以p = &x=1;也是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-17 23:52:06 | 显示全部楼层
计算机中有很多的“临时变量”,它们没有名字,如
int a = 5;
a+1就可以认为是这类“临时变量”,因为它没有名字,所以它的生存周期很短,所以一般不能够对这类变量取地址(它的存储和正常变量的存储不一样),所以p = &(x+1);中&(x+1)是错误的

此外,int x = 5;
&x也是“临时变量”,这些临时变量也是不能赋值的,所以&x=1是错的了,所以p = &x=1;也是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-17 23:53:53 | 显示全部楼层
C  选项写错了 不好意思

C: P = &X+1;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 00:18:39 | 显示全部楼层
    我发表下我的看法啊。
    b项中的x+1的结果是一个具体的常数,&符号是不能对一个具体的常数用的。
    还有,我认为c也有问题,因为变量x在定义时已经给定了一个地址,而这个地址对于变量x是不能改变的,而c的&x=1却改变了它,所以我认为这个选项也有问题。
    上面是我的看法,有什么不对的请包涵。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 00:20:29 | 显示全部楼层
x+b  之后是什么 它是一个const 类型的数据了  比如变量x=5;5+1之后呢?所以它取地址等于是取了一个常量的地址  比如 &5   这是不合理的。向一个5要地址?。我们可以让指针指向这个常量 编译可以通过但是这样会出点问题  比如 程序崩溃
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 08:35:38 | 显示全部楼层
一定要给分哦,亲!正在努力冲向渔友1中,B选项是错误的,X+1是一个立即数值,不能够取地址,看过小甲鱼汇编的都知道,立即数的代入是在机器代码中实现,所以它没有地址,跟别提指针可以指向它了。C选项是正确的,是指向下一个类型地址的指针!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 09:44:47 | 显示全部楼层
C选项改为 &x+1 之后 没什么问题

B错 D错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 10:36:18 | 显示全部楼层
本帖最后由 tsembrace 于 2013-6-18 12:20 编辑

关于B是错误的已经是共识不多说了
关于D:   p = &x++;
无论&和++的优先级如何,语义上都是正确的
若p=(&x)++;则&x先进行操作,赋给p,然后&x再增1;
若p=&(x++);不管x值怎样变化,其内存单元都没有变化,也没有问题的


基于楼下的回复,请忽略本楼我个人错误的理解


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 11:24:32 | 显示全部楼层

x++的结果按照版主通俗的说法就是一个临时对象
不占内存 不许&
&x的结果按照版主通俗的说法就是一个临时对象
不占内存 是一个常量 [雷同于0xABBCDEDE] 是不能++的
5++ 是error

现在D选项还有没有问题??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 11:25:43 | 显示全部楼层
tsembrace 发表于 2013-6-18 10:36
关于B是错误的已经是共识不多说了
关于D:   p = &x++;
无论&和++的优先级如何,语义上都是正确的

另外 优先级不清晰就查一查吧这里正确的解析是 &(x++)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 12:26:45 | 显示全部楼层
我是师兄 发表于 2013-6-18 11:24
x++的结果按照版主通俗的说法就是一个临时对象
不占内存 不许&
&x的结果按照版主通俗的说法就是一个临 ...

感谢师兄
另开一楼再说下现在的理解。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 12:49:17 | 显示全部楼层
本帖最后由 tsembrace 于 2013-6-18 12:50 编辑
我是师兄 发表于 2013-6-18 11:25
另外 优先级不清晰就查一查吧这里正确的解析是 &(x++)


在8楼回复时候,我甚至在没有调试的情况下就出妄言,实在脸红。
午饭后回来看到楼上师兄的指点,试着理解,有所清晰,但应该还不够彻底。
针对楼主选项D依然撇开优先级来说,这里的撇开只是针对两种情况下指针操作的分析,而不是偷懒和回避优先级。
1、对于p=(&x)++
&x先进行操作,赋给p,至此,按目前我的理解都没有问题,问题在于后续的&x再增1,如师兄所言,&x是一个“临时”的数据,是不能进行自增自减操作的;
2、对于p=&(x++)
简单些说,这里的问题在于"x++"是一个表达式,他的返回值是一个数据,即x的数值,而非变量x;自然也就出错了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-18 22:34:43 | 显示全部楼层
B和D都错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 19:09:38 | 显示全部楼层
路过看了一下,应该是B是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-24 11:50:40 From FishC Mobile | 显示全部楼层
本帖最后由 183560656 于 2013-6-24 12:19 编辑

知道了,自己看错了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-23 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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