課程
/后端開發(fā)
/C
/Linux C語言指針與內(nèi)存
我想了解的是為什么指針指向常量的地址,輸出值時,地址是常量的地址,結(jié)果卻不一樣,我知道常量不能修改,但是為什么會有這種情況?謝謝大家。
2017-12-06
源自:Linux C語言指針與內(nèi)存 4-3
正在回答
這里簡單回答一下 避免以后有人看到??
第一點? 這個 問題? 在 C 語言 和C++ 結(jié)果 可能會有區(qū)別? ?而且 在不同編譯器可能也會有區(qū)別?
這里沒有測試 不糾結(jié)不同編譯器? 的結(jié)果?
首先如果 是C 語言? 輸出結(jié)果應(yīng)該都是 修改后的結(jié)果?
正常的預(yù)期是 不同編譯結(jié)果也都是一樣的 都是 修改后的結(jié)果?
但是在C++里面 輸出的 兩個值 確是不同的? 大部分編譯器都是不同的??
這里是因為C++ 對const 常量 進行了 優(yōu)化??
如果想具體了解 可以百度?“?C++ 常量折疊” 很容易找到? 結(jié)果很多
還有就是 如果 你認為你寫的 是C語言的代碼? 跟C++沒有關(guān)系?
這里可以給你個簡單的建議 把 上面代碼 復(fù)制 保存到.c 文件? 看看 就知道了?
因為 樓主 是用cpp 文件保存的 所以 一般情況下,編譯器看見cpp 文件 直接默認就用cpp 方式編譯了?
c語言的好理解 畢竟? 就是 同一個值 修改了? 也一起修改
c++ 因為引入了 優(yōu)化?
這里有個? 常量 符號表 默認常量 會在 符號表保存 默認值? 使用時 默認從 常量表取值
而 指針指向的 是 這個值得具體內(nèi)存 所以就是說 確實 有2分 不同的值 保存了
這樣 也有一個好處就是 如果你修改了 const 的值 在使用的時候? 使用的 還是未修改的
既然是const? 就是 不能修改的 所以 這個優(yōu)化 可以為你帶來的 好處就是你不小心修改了常量?
而使用時候 確實未修改的 這樣 有時候 是有助于 程序健壯性的?
可能是地址的引用不同了吧,開始是把80指向pi這個地址變量。然后又把這個地址變量重新指向了20,雖然還是同一個地址,但引用的值改變了
?#include<stdio.h> ?main() { const?int?il=80; int?*pi; pi=?(int?*)?&il; *?pi=20; printf("%d+pi\n",*pi); //pi所指向地址上的值 printf("%s+pi\n",pi); //pi指針所指向地址 printf("%d+il\n",il); //il的值 printf("%s+il\n",&il); //il的地址 getchar(); }
這是源碼
舉報
指針-C語言的核心,代領(lǐng)大家對c語言有更加深刻的理解
1 回答都說數(shù)組是指針常量 為什么p str 的時候輸出內(nèi)容 ,不輸出地址
2 回答str[]="hello" str是數(shù)組的首地址,是個數(shù)值常量,為什么p str 會輸出hello?
2 回答為什么地址一樣數(shù)值不一樣?
2 回答p *pa是訪問地址所指的內(nèi)容,那int *pa=&a;這不是地址嗎,怎么*pa又是地址又是所指的內(nèi)容?怎么回事?
1 回答為什么循環(huán)中i會自動指向a的內(nèi)存地址?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2020-11-24
這里簡單回答一下 避免以后有人看到??
第一點? 這個 問題? 在 C 語言 和C++ 結(jié)果 可能會有區(qū)別? ?而且 在不同編譯器可能也會有區(qū)別?
這里沒有測試 不糾結(jié)不同編譯器? 的結(jié)果?
首先如果 是C 語言? 輸出結(jié)果應(yīng)該都是 修改后的結(jié)果?
正常的預(yù)期是 不同編譯結(jié)果也都是一樣的 都是 修改后的結(jié)果?
但是在C++里面 輸出的 兩個值 確是不同的? 大部分編譯器都是不同的??
這里是因為C++ 對const 常量 進行了 優(yōu)化??
如果想具體了解 可以百度?“?C++ 常量折疊” 很容易找到? 結(jié)果很多
還有就是 如果 你認為你寫的 是C語言的代碼? 跟C++沒有關(guān)系?
這里可以給你個簡單的建議 把 上面代碼 復(fù)制 保存到.c 文件? 看看 就知道了?
因為 樓主 是用cpp 文件保存的 所以 一般情況下,編譯器看見cpp 文件 直接默認就用cpp 方式編譯了?
c語言的好理解 畢竟? 就是 同一個值 修改了? 也一起修改
c++ 因為引入了 優(yōu)化?
這里有個? 常量 符號表 默認常量 會在 符號表保存 默認值? 使用時 默認從 常量表取值
而 指針指向的 是 這個值得具體內(nèi)存 所以就是說 確實 有2分 不同的值 保存了
這樣 也有一個好處就是 如果你修改了 const 的值 在使用的時候? 使用的 還是未修改的
既然是const? 就是 不能修改的 所以 這個優(yōu)化 可以為你帶來的 好處就是你不小心修改了常量?
而使用時候 確實未修改的 這樣 有時候 是有助于 程序健壯性的?
2018-05-23
可能是地址的引用不同了吧,開始是把80指向pi這個地址變量。然后又把這個地址變量重新指向了20,雖然還是同一個地址,但引用的值改變了
2017-12-06
這是源碼