c 指標和記憶體結構總結

2021-08-03 09:18:11 字數 1434 閱讀 2499

指標的操作:+加法 -減法 sizeof() *解引用 ->指向操作符

int arr[3]=;

int *p1=arr;//和int *p1=arr[0]一致

int *p2=p1+1;//和int *p2=arr[1]一致

int *p3=p2-1;//和int *p1=arr;一致

解引用操作:

int a=10;

int *p=&a;//p記憶體塊中儲存的是變數a的記憶體位址

cout<<*psizeof(p);//變數p的位元組長度,比如p為int型別,那麼sizeof(p)一般為4個位元組。

注意事項:

1、普通指標變數2邊型別必須一致(常量指標可以不一致,但必須可以隱試轉換)

空指標:int *p=null, *p=0, *p=nullptr;(最後一種是c++的寫法,前面2種是c的寫法)

無效指標:int *p;

3、不能訪問無效指標

4、乙個指標變數最多只能指向一種基型別的變數,但乙個基型別的變數可以被多個同型別的指標變數指向

5、對指標變數的解引用操作,都是對基型別變數的操作。如:int a=10;int *p=&a;*p=11;//和a=11;操作結果一樣

二、c++記憶體模型:

1、源**區:儲存**的區域(類似jvm裡的方法區)

2、靜態區:儲存靜態變數和全域性變數的區域(類似jvm裡的方法區里的方法區)

3、棧區:儲存區域性變數和引數的記憶體區域,由系統開闢、由系統**的記憶體區域(類似jvm裡的棧)

4、堆區:程式設計師開闢的一塊記憶體區域用來儲存物件的區域,由使用者開闢和**的記憶體區域。(類似jvm裡的堆)

5、常量區(字面值區):(類似於jvm裡的方法區的常量池)

指標變數能指向那些區域:

棧區、堆區、靜態區、常量區、**區

三、函式指標和指標函式

函式指標:是乙個指標,它指向函式

指標函式:是乙個函式,其返回值為指標

標頭檔案:一般用於申明函式,在需要使用時,可以通過#include 「頭檔名」 將標頭檔案引入進來

庫檔案:一般用於標頭檔案申明函式的實現

函式指標:

比如有個函式為:void myswap(int *a,int *b);

定義函式指標:void (*p)(int *,int *)=myswap;//除了函式名外,其他的地方都必須和函式一樣,函式名這裡必須用「(*指標名稱)」,

它是乙個指向函式的指標

int x=1,int y=2;

呼叫函式指標執行函式:(*p)(&x,&y);

呼叫函式有如下幾種方式:

myswap(&x,&y);

(*myswap)(&x,&y);

(*p)(&x,&y);

C 和記憶體指標

雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指標在對一些涉及以結構陣列存放的記憶體區操作可能就力有不及了,...

C 和記憶體指標

c 和記憶體指標 關 鍵 詞 serverword.net 雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指...

C 結構 和指標

定義新的結構後會有新的結構成員,然後再建立給結構變數 struct可以省缺 其中結構變數可以是基本型別也可是指標,陣列等。include includeusing namespace std struct infltable 定義新結構指出了新型別的特徵 結構定義 不能省 void main inf...