int a = 10;
int &p = a; //正確
int &p2; //錯誤,引用必須初始化
double a = 10;
int &p = a; //錯誤,型別不一致
int &a=null; //錯誤
int &a=1; //錯誤
int a = 10;
int &p = a;
p = 20; //就是對a操作
std::cout << a << endl; //20
int a=1;
int &pa=a;
pa+=1;
cout<普通陣列的引用
int arr[3];
int (&p)[3]=arr;
指標陣列的引用
int* arr[3];
int* (&p)[3]=arr;
const int a=10;
a=20;//錯誤
int a=10;
const int b=a; //正確
const int c=10; //正確
const int a=10;
int b=a;//正確
int a=10;
const int &b=a;
其他檔案的區域性變數會覆蓋const常量。
其他檔案的全域性變數會報錯,顯示重定義
const int ci = 1024;
const int &r1 = ci; //正確,引用到常量上
r1 = 42; //錯誤,不能對常量的引用進行修改
int &r2 = ci; //錯誤,不能讓乙個非常量引用指向乙個常量物件
//因為引用可以通過改變自身值而改變所引用的值,所以為了防止引用改變值,禁止使用普通引用引向const常量
//**段1
double dval = 3.14;
const int &ri = dval;//正確 /*
上面的**會生成乙個int型別的臨時變數,然後將臨時變數賦值給ri,因此上述**可以擴充套件為:
double dval = 3.14;
const int temp = dval; //臨時變數
const int &ri = temp ;
*/
//**段2
int i = 42;
const int &r1 = i; //正確,允許將const int&繫結到乙個普通物件上
const int &r2 = 42; //正確
const int &r3 = r1 * 2;//正確
int &r4 = r1 * 2; //錯誤
const double pi = 3.14;
double *ptr = π //錯誤。ptr是非常量的
const double *cptr = π//正確
double dval = 3.14;
const double *cptr = &dval; //正確
const double dval = 3.14;
const double *cptr = &dval; //正確
*cptr = 6.28; //錯誤
double dval2 = 3.14;
const double *cptr2 = &dval; //正確
*cptr2 = 6.28; //錯誤
這種型別的const也被稱為「底層const」:表示指標所指向的值是個常量
這種型別的const也被稱為「頂層const」:表示指標本身是個常量
const int* pa; //常量指標
int const* pb; //常量指標
int * const pc; //指標常量
int const* const pd;//常量指標常量
常量指標,因為所指物件是個常量,所以有下面的規則const對左邊的型別起作用,當const左邊沒有東西時,才對右邊的起作用,因此有以下規則:
當然,上面的規則可以簡化為下面一句話:
const出現在「*」號的左邊,代表所指之物是常量
const出現在「*」號的右邊,代表指標自身是個常量
int a = 1;
const int b = 2;
const int *pa = &a; //正確,可以指向非常量
pa = &b; //正確,指向可以改變
*pa = 1; //不能通過常量指標修改所指物件的
指標常量,因為指標是個常量,而不是型別是常量,因此有下面的規則:
int a = 1;
const int b = 2;
int c = 3;
int* const pa = &a; //正確,a是非常量
int* const pb = &b; //錯誤,b是常量
*pa = 10; //正確,可以修改指向物件的值
pa = &c; //錯誤,不能修改pa的指向(因為指標自身是個常量)
常量指標常量,有如下規則:
int a = 1;
const int b = 2;
const int *const p1 = &a; //正確
const int *const p2 = &b; //正確
*p1 = 2; //錯誤
p1 = &b; //錯誤
int i = 0;
int j = 0;
const int ci = 42;
const int *p2 = &ci;
int *const p1 = &j;
const int *const p3 = p2;
p3 = p1; //錯誤,p3的指向也不能更改
int *p = p3; //錯誤,p3包含const,而p沒有
p2 = p3; //正確,p2和p3都包含底層const
p1 = p3; //錯誤,p1的指向不能更改
引用和const關鍵字
引用的概念 1.定義引用時一定要將其初始化成某個變數 2初始化後,他就一直引用這個變數,不會在引用其他變數了,也就是說引用是至始至終的 3.引用只能引用變數,不能引用常量和表示式double a 4,b 5 double r1 a double r2 r1 r2 10 cout r1 b 不是引用,...
C語言關鍵字 Const
c中const的使用 雖然這聽起來很簡單,但實際上,const的使用也是c語言中乙個比較微妙的地方,微妙在何處呢?請看下面幾個問題。問題 const變數 常量 為什麼下面的例子在使用乙個const變數來初始化陣列,ansi c的編譯器會報告乙個錯誤呢?const int n 5 int a n 答案...
C中const關鍵字
const 用法 定義常量,修飾指標 函式的輸入引數和返回值,把定義或者修飾的變數屬性設為唯讀。本質上它只是在全域性資料段或者棧中定義的是乙個唯讀的常量,不是真正位於字串常量區。所以關鍵字const 並不能把變數變成真正的常量,事實上還是可以改變 const 定義的變數的值。const 的目的是為了...