CS50为啥不能对int a,*a这么写
卸腰,你想多了int *a的类型是int *,不是int。实际上,你最后一段话里的所有pointer换成星号,离正确的理解差得不多。。。int pointer,读作int(eger) pointer,写作int*。
■网友
你废话太多* 正确写法是修改地址是修改地址映射的值* 你那错误写法返回的不是main 里的值没事拿gdb多调试
■网友
lol, 我刚接触pointer时也很难理解。。。然后是pass by reference或by pointer和by value的区别,不知道楼主现在搞清楚了没,看时间已经有一年了。。。不过我还是想试着回答清楚,因为现有的三个答案里只有杨个毛在好好回答问题。
正确写法还有一种:void swap(int \u0026amp;a, int \u0026amp;b){int temp = a;a = b;b = temp;}这种就是pass by reference了,坏处是,别人调用它的时候,不需要dereference,直接swap(a, b);别人可能没有意识到argument是pass by reference的,它们的value会在function内被修改。如果是pass by pointer,调用的时候是要加\u0026amp;号的swap(\u0026amp;a, \u0026amp;b);可以减少一些误会。
另外我突然发现,你所谓的正确写法最后一行也错了,应该是*b = temp;为了帮助你理解,我们来看看这个程序在stack memory里到底是怎么运行的。
首先,你有两个int, a和b,它们分别在stack memory的两个地方,比如说0xaaaaaaaa和0xbbbbbbbb。然后,你调用到swap函数时会有两个int pointer: int* a, int* b, 它们也分别存在于stack memory的两个地方,有它们自己的地址,比如0xXXXXXXXX和0xYYYYYYYY,然后它们分别存储了那两个int的地址,也就是第一个ptr储存了a的地址(0xaaaaaaaa),第二个ptr储存了b的地址(0xbbbbbbbb)。紧接着,swap里面又declare了另一个int叫temp,并将a的值assign给了temp(当“ * ”在variable前面的时候,就不叫pointer了,可能这里你有点误会,而是dereference operator,作用是获取该ptr所指的东西的值)。然后互换这两个ptr所指的值。如果像你那么写的话,你pass进来的是两个数的copy(所谓pass by value,这个概念很重要),换来换去都是这两个copy在互换,等函数调用完毕,里面declare的这些local variables(包括arguments)将随着“}”的结束而从stack里自上而下消失,对原始的两个数没有影响。
【CS50为啥不能对int a,*a这么写】 不知道我这样讲清楚了没,自我感觉蛮清楚了。
■网友
退一万步,在一个 I32LP64 的平台上,int 是 32 位,int * 是 64 位……然后就呵呵了。
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- 为啥到现在你还没有女朋友 ?
- 天赐的声音|33岁张雨绮为啥总离婚?看过这些照片就明白了,都是性感惹得祸
