看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ooww (亞古獸)》之銘言: : (第一次發問,請鞭小力一點) : 1. const int *ptr; : 2. int * const ptr; : 3. const int *const ptr; : 這三個宣告差在哪裡? : 第1個我了解, : 第3個的" * "跟const貼在一起是什麼意思? 第2個---ptr是個常數指標,指到一個int 第3個---ptr是個常數指標,指到一個常數int 我測試的結果 , "常數"的意義是無法"直接"assign給此變數 即使assign的是同一值 但是"間接"assign可以 以下是測試的code VS2005編譯的 #include "stdio.h" #include "conio.h" int main(void) { int x = 5 , y = 10; const int *ptr1; // ptr1是個指標,指到一個常數int int *const ptr2 = &x; // ptr2是個常數指標,指到一個int const int *const ptr3 = &y; // ptr3是個常數指標,指到一個常數int int **ptr_breaker; // 搞破壞用的指向int *的指標 // 1st example ptr1 = &x; printf("%d\n",*ptr1); // *ptr1 = *ptr1; // 這一行編譯會出錯 , 即使assign的是同一值 x = 6; printf("%d\n",*ptr1); // 但如果是經由x間接改變 就不會出錯 // 2nd example // ptr2 = &x; // 這一行編譯也會出錯 , 即使assign的是同一值 printf("%d,%d\n",*ptr2, (int)ptr2); // 3rd example // ptr3 = ptr3; // *ptr3 = &y; // 這兩行編譯也會出錯 printf("%d,%d\n",*ptr3,(int)ptr3); ptr_breaker = (int **)(&ptr3); *ptr_breaker = &x; printf("%d,%d\n",*ptr3,(int)ptr3); // 惡搞過後 , ptr3指向的值與儲存的 // 位址都被改變 getch(); return 0; } 感覺上 如果真的要宣告為const的話 還不如用#define 比較不容易在開發中出錯 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.138.161.236
avhacker:最後兩行大誤,大家不要學喔 01/09 10:47
del680202:最後兩行我也覺得有爭議 01/09 10:53
stockton19:間接給值可以? @@ 01/09 11:29
LPH66:const請理解為你請編譯器幫你抓你耍笨而不小心改到值的地方 01/09 16:18
LPH66:簡單說就是個防呆 01/09 16:18
dendrobium:編譯器可以過,不代表就是正確的寫法@@a 01/09 16:40
bil193:請問大家是都建議用const取代#define嗎?那現在一堆市面上 01/10 01:45
bil193:的書和範例程式都用一堆#define 不就有問題 01/10 01:45
bill42362:兩個動作差很多喔 #define 只是單純文字代換而已 01/10 01:49
bill42362:所以可以定義一堆 #define O ); 最後變成圈圈文 01/10 01:50
bill42362:之前有出現一篇圈圈文 的體重轉換器...XDDD 01/10 01:52
bil193:嗯我知道 但是const double PI=3.1415;跟#define PI 3.1415 01/10 01:57
bil193:這兩個 第一個好像比較多人推 第二個書上常看到... 01/10 01:57
bil193:我們要的功能都差不多 到底要用哪個呢? 01/10 01:58
james732:const還有scope與type checking的好處 盡量用const吧 01/10 22:20