const的高階用法
本文主要展示constant陣列、constant指標和指向constants的指標的用法。
const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31}; days[9] = 44;/*編譯出錯 */ //指向常量的指標不能用於改變指向的資料的值,具體可以參考下面的程式碼 : double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * pd = rates;// pd points to beginning of the array /* 上面程式碼的第二行將pd指標指向的物件為const型別,這意味著你不能**使用pd指標**來改變pd所指向的物件的值: */ *pd = 29.89;// 不允許 pd[2] = 222.22;// 不允許 rates[0] = 99.99; // 允許,因為rates陣列不是const型別 //在上面的例子中,不管使用指標標記法(*pointer)還是陣列標記(pointer[i]), //你都不能使用指標pd改變所指向內容的值。但是,rates沒有被宣告//為const, //所以你仍然可以使用rates來改變數值。當然,你可以讓pd指向其它位置: pd++;/*使pd指向rates[1],允許*/ /*指向常量的指標用作函式的形參時,表明函式不打算用指標改變資料。例如, 函式*/void show_array(const double ar[], int n);/*可以宣告為這樣的形式*/:void show_array(const double *ar, int n); /* 可以將非常量資料或者常量資料的地址賦給指向常量的指標: */ double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; const double * pc = rates;// 合法 pc = locked;// 合法 pc = &rates[3];//合法 /*然而只有非常量的資料的地址可以賦給普通的指標:*/ double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; double * pnc = rates;// 合法 pnc = locked;// 不合法 pnc = &rates[3];// 合法 /*函式show_array()可以接收普通的陣列或者常陣列作為實參,因為二者的地址都可以賦給指向常量的指標:*/ show_array(rates, 5);// 合法 show_array(locked, 4);// 合法 /* 因此,使用在函式宣告時使用const不僅可以保護資料,還允許函式接收常陣列。像下面的函式 mult_array()不能接收常陣列的地址: */ mult_array(rates, 5, 1.2);// 合法 mult_array(locked, 4, 1.2);// 不合法
show_array()原型為void show_array(const double ar[], int n);
或者void show_array(const double*, int );
mult_array()
函式原型為void mult_array(double ar[], int n, double mult);
函式原型可以參考陣列形參文章
下面是關於const的更多用法,比如,宣告和初始化指標時使指標只能指向一個地方,而宣告方式有點戲劇性,只是和const的 位置 和上面例子中的不一樣:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向陣列的首地址
pc = &rates[2]; // 不合法,pc不能指向其它地方
*pc = 92.99; // 合法,pc的值不能變但是指向的物件的值能變
這樣的指標依然可以改變指向的物件的值,但是它只能指向最初被賦予的位置。
如果你希望指標值和指標指向的值不變,你可以使用 兩個const :
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * const pc = rates;` pc = &rates[2];// 不允許 *pc = 92.99;// 不允許