我也来玩一个C语言计算的题

[复制链接]
929|5
手机看帖
扫描二维码
随时随地手机跟帖
computer00|  楼主 | 2018-4-9 08:57 | 显示全部楼层 |阅读模式
看看下面这段代码输出什么:

#include <stdio.h>

int main(int argc, char **argv) {
     int v[3]={7777, 8888, 9999};
     int *p;

     p = v + 1;
     printf("val=%d\n", -1[p]);
    return 0;
}


评分


相关帖子

gujiamao12345| | 2018-4-9 09:56 | 显示全部楼层
运行了下  = -9999
p=v+1;
最终结果等于v+2,再加上负号

使用特权

评论回复
xyz549040622| | 2018-4-9 21:55 | 显示全部楼层
[p],这是什么操作?

使用特权

评论回复
computer00|  楼主 | 2018-4-10 09:11 | 显示全部楼层
xyz549040622 发表于 2018-4-9 21:55
,这是什么操作?

我也不知道是啥操作。。。只是玩的时候发现居然可以这样玩,哈哈
看看我以前写的**:

C语言指针和数组脑洞大开
    大学上C语言课时,老师说数组名其实也是一个指针,可以当成指针来用,只不过它是一个指针常量。后来倒过来,说指针除了使用*的方式来访问之外,也可以像数组那样通过中括号[]来访问。
    例如,我们有指针int *p,当我们想访问偏移为0的值时,可以用*p,*(p+0),p[0]等方式,都是可以的。然后圈圈在使用指针时,就比较喜欢用[]的方式去对指针操作了,因为可以偷懒啊,少打很多字啊(偷懒即高效)。
    然后有一天圈圈无聊的时候就在思考(用想这个词太Low了),这个指针和数组名到底是不是完全等价的?(仅看访问方式,不考虑常量和变量的角度)
    当我们要访问指针p偏移i的位置时,我们一般会使用*(p+i)的方式。小学数学老师教过我们,加法是满足交换律的。所以圈圈就想,那我改成*(i+p)的方式可以不?读者自己想想看,可以不嘛?至少看上去应该是可以的,对吧?
    也许有些人说不可以,因为在计算偏移量时,是以p的类型来计算的,在p的基础上偏移i个p类型大小。如果你把i放到前面,就会出问题,编译器会搞错。光想是没用的,什么事圈圈都喜欢试试看。
    放到编译器里编译,好家伙,编译通过了,再看运行结果,也是对的。同时,我们再试试p的方式,OK,这个基本上没太大悬念,应该都会说可以。我们来观察一下这两个等价的式子:*(p+i)等价于p。抛掉物理意义,光从字符上来看,如果左边的p和i交换一下,那么右边也应该同样变化(这就是数学的美,不过年轻时不懂,哎),所以右边就成了i[p]。之前说了,左边交换是OK的,那右边交换后这样写在C语言里还OK吗?你是不是也很好奇?那还是试一试呗,写好代码,点击编译,下面刷刷出编译日志(你的小心脏是不是已经开始有点小激动了?),靠,编译居然通过了。然后再运行(眼睛紧盯着屏幕),结果居然对了^_^。
    更变态一点,把偏移量改成常量行不行呢?例如之前访问的是p[0],那我换成0[p]是不是也可以?看上去很酷对不对?因为后人看你的代码时,嘿嘿,你懂的。改好代码,编译运行,一切看上去是那么的美好……是不是有点毁三观的感觉……
    好了,有了上面这些知识,下次你去面试时,就可以去考面试官了:“你学过C语言么?”面试官略略点一点头。你说,“学过C语言,……我便考你一考。指针使用,怎样写的?”面试官想,还没毕业的人,也配考我么?便低下头去看简历,不再理会。你等了许久,很恳切的说道,“不会写罢?……我教给你,记着!这些知识应该记着。将来做总工的时候,写代码要用。”面试官暗想我和总工的等级还很远呢,而且我们总工也从不将指针写到代码里去;又好笑,又不耐烦,懒懒的答道,“谁要你教,不是在指针名前加个*号么?”你显出极高兴的样子,将两个指头的长指甲敲着桌面,点头说,“对呀对呀!……指针使用有四样写法,你知道么?”…………凡是不知道的面试官,你就不要去这样的公司了。

    思考:假设*(p+1)的值为8888,*(p-1)的值为9999,那么我写-1[p],它的值应该是多少呢?

                                        签名:本人所有发言仅代表个人观点,在相信之前请慎重考虑。

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
xyz549040622 + 10 爱思考的圈圈,仿佛明白了什么!
computer00|  楼主 | 2018-4-10 09:12 | 显示全部楼层
gujiamao12345 发表于 2018-4-9 09:56
运行了下  = -9999
p=v+1;
最终结果等于v+2,再加上负号

我运行的结果也是这个。

使用特权

评论回复
gujiamao12345| | 2018-4-10 09:31 | 显示全部楼层
xyz549040622 发表于 2018-4-9 21:55
,这是什么操作?

我就理解成1+p和p+1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:MAXHUB高效会议平台

246

主题

14682

帖子

206

粉丝