case1 :
const int n=5;
int a[n];
不能這樣使用,即使編譯通過,對陣列a大小的宣告也是無效的。因為const修飾的是唯讀變數,而ansi c規定
陣列定義時長度必須是「常量」,
在ansi c中用什麼來定義
常量呢?答案是
enum型別和#define巨集,這兩個都可以用來定義常量。
case 2:
例:下面的**編譯器會報乙個錯誤,請問,哪乙個語句是錯誤的呢?
typedef char * pstr;
char string[4] = "bbc";
const char *p1 =" string"; //1式
const pstr p2 =" string"; //2式
p1++;
p2++;
答案與分析:
問題出在p2++上。
const使用的基本形式是:
形式1:const type m:其中m是限定不可變的,type是資料型別,可以使標準資料型別,也可以是自定義型別。此例中pstr是自定義的資料型別,因此p2是不可變的。
形式2:
type const m;//只要牢記這兩種基本形式,在含多個const的語句中,可以先把const 去掉分析。
例如:
const char * const p; //*p和p都不可變
//倆個都去掉:char *p;//定義的是字元型指標
//去掉乙個:char *const p;//由形式2可知,p不可變
const char *p;//由形式1可知,*p不可變
case 3
int const * p1,p2;
int d=9;
p2=5;//錯誤,p2是const的
p1=&d;//正確,p1不是const
*p1=3;//錯誤,*p1是const
printf("%d\n",*p1);
*p1++;//*的優先順序低於++;所以可以編譯通過 但位址已經不是d的位址
printf("%d\n",*p1);
p2是const;(*p1)是一整體,因此(*p1)是const,但p1是可變的。
同樣去掉const分析,int * p1,p2只代表p1是指向整型的指標,要表示p1、p2都是指標是需寫成int * p1,* p2。 而
int * const p1,p2;
int d=9;
p2=5;//正確,p2不是const的
p1=&d;//錯誤,p1是const
*p1=3;//正確,*p1不是const
補充:
int* const px;//這種定義是不允許的,即使在c中編譯可以通過,但在c++編譯不通過。(指標常量定義的時候需對其進行初始化)
int const *px;這種定義是允許的。同樣在c中可以編譯通過,但在c++中編譯不通過(常指標可以再定義的時候不初始化)
c++中需要對const常量定義時同時初始化。
總結:
使用const定義唯讀變數時關鍵要弄清楚哪些量是唯讀的不可變的,哪些量是可變的。
例如:int const px;
px=9;//非法,px是唯讀的。因此在定義時最好完成初始化工作。
C中CONST的使用
基本解釋 const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的健壯性,另外,在 別人 的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。雖然這聽起來很簡單,但實際上,const的使用也是c語言中乙個比較微妙的地方,微妙在何處呢?請看下...
c中const的使用
const關鍵字 int const p和const int p的功能一樣,都是p指向的物件不能通過p指標改變,p可以變 即 p為常量,不可以改變,而指標p為變數可以更改。int a 1 int b 2 int const p1 p1 a p b 可行 p1 3 不可以 int const p宣告中...
C中CONST的使用
基本解釋 const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的健壯性,另外,在 別人 的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。雖然這聽起來很簡單,但實際上,const的使用也是c語言中乙個比較微妙的地方,微妙在何處呢?請看下...