C 記憶體的知識 常量與指標 const

2021-10-19 01:42:47 字數 2026 閱讀 3195

1、stack(棧):編譯器自動分配、釋放(存放區域性變數,函式引數,返回資料,返回位址等內容)

2、heap(堆):一般由程式設計師分配、釋放(為動態記憶體分配提供位址空間)

3、全域性區/靜態區:全域性區和靜態區存放在同乙個區,程式結束釋放

4、常量區:常量不可修改

堆向高位址方向生長;

棧向低位址方向生長;

對於陣列a,a是陣列a的首位址的別名,要訪問陣列元素可以用a[i]或者*(a+i);

2、char *a = 「world」;

a是char型別的指標放在棧區,指向字串」world「的首位址;」world「是字串常量放在靜態區

指標p為const char*型別,是常量指標 ,不能改變,所以a,c,d錯;

指標p指向字串」world「的首位址,位址為p的內容是」hello「,位址p的記憶體單元的內容改為」hello「不會出錯。

1、定義:乙個指標所指的資料是常量,這個指標被稱為常量指標;

2、舉例:

int x = 1;

const int* p;

p =&x;//正確

*p = 5;//錯誤,常量指標所指向的值不能通過*p來修改

1、定義:我們把指標放到常量中,就是指標常量;

2、舉例:

int x = 1,y = 2;

int* const p =

&x;*p = 5;//正確

p =&y;//錯誤,指標本身是乙個常量,不能改變

1、定義:乙個常量中存著乙個指標,這個指標又指向另外乙個常量。

eg:

int x = 5;

const int* const p =

&x;

小結:在前先讀,在前不變

補充:

這題p為指標常量,指標是乙個常量,不允許p++,b,c錯;p[3]不存在,d錯

這題是乙個常量指標,不允許修改指標p所指向的常量,即不能*p = 『x』 , 所以c,d錯。

(1)const常量具有型別,編譯器可以進行安全檢查;#define巨集定義沒有資料型別,只是簡單的字串替換,不能進行安全檢查

(2)const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干個拷貝。

(1)const int

const int func1(

);//返回值是常量

(2)const int*

const int* func2(

);//指標指向的內容不變,不可以*p = 3;

(3)int *const

int *const func2(

);//指標本身不可變,不可以p++;

1、如果在編寫const成員函式時,不慎修改資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤。

2、使用const關鍵字進行說明的成員函式,稱為常成員函式,對於類中的const成員變數必須通過初始化列表進行初始化。

C 常量指標與指標常量

c 常量指標與指標常量 1.常量指標 形如 int const p 或 const int p,p稱為 常量指標 例1 include using namespace std int main 執行結果 a的值 30 p的值 30 p重新賦值 40 在例1中,可以看到,p可以先宣告再賦值,而且p可以...

C 指標常量與常量指標

指標常量 const int m 3 m是乙個常量,不能被改變 int n 10 int p m 錯誤,p是乙個普通指標,不能指向常量m const int p1 m 正確,因為p1是常量指標,可以指向常量與非常量 p1 n 正確,但是不能通過 p1更改n的值,只能存放n的位址 還有一點是指標型別必...

指標常量與常量指標 C

常量指標 const int int const 乙個指標,指向的內容是乙個常量,內容不能修改,但指標本身可修改。修改內容時,編譯器報錯 error assignment of read only location 指標常量 int const 乙個常量,常量本身是乙個指標,指標本身不能修改,但指標...