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