C 引用 以及const關鍵字

2021-10-06 15:54:40 字數 3633 閱讀 3547

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 的目的是為了...