作者AJE (小傑)
看板C_and_CPP
標題Re: [問題] c how to program P.274~275宣告的poin …
時間Sat Jan 9 09:56:44 2010
※ 引述《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