C 探幽 指標與陣列的對比

2021-10-10 15:18:43 字數 1356 閱讀 7950

陣列要麼被建立在靜態儲存區(如全域性陣列),要麼被建立在棧上(區域性陣列)。陣列名對應著一塊記憶體,而不是指向一塊記憶體,其位址與容量保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,其特徵是可變。因此經常使用指標操作動態記憶體塊,比陣列靈活,卻也更危險。

char *p="hello";//其實在vs2017裡邊,該指標不能這樣定義,而是const char *p="hello"才不會報錯。

cout《所以∗p*p

∗p指向常量字串,而對於以下**:

char p="hello";

p[0]="h";

cout《雖然p可以理解為乙個指向陣列首個元素的位址的指標,但是本質上對應著一塊記憶體,而不是指向一塊記憶體,內容是可以改變的。

陣列不能對陣列名直接比較,若想把陣列a的內容複製給b,不能使用語句b=a,而應該使用標準庫函式strcpy進行複製。比較a和b內容是否相同,不可以直接使用if(b==a),因為這樣比較的是位址,而內容的比較需要使用標準的庫函式strcmp()

char p = "hello";

char a[10];

strcpy_s(a, p);//a=p;編譯器會報錯

cout << a << endl;

if(strcmp(a,p)==0)cout<<"true"《指標

指標直接相等代表著兩個指標指向同乙個位址,如果指標a需要複製指標b的內容,需要先為指標a申請一塊記憶體,然後使用strcpy,strcmp等函式進行copy和比較

int len=strlen(b);

char *a=(char*)malloc(sizeof(char)*(len+1));

strcpy(a,b);

if(strcmp(a,b)==0)cout<<"true"int p = ;

int a[10];

int *pp = p;

cout << sizeof(p) << endl;

cout << sizeof(a) << endl;

cout << sizeof(pp) << endl;

輸出分別是16,40,8

當陣列作為函式的引數進行傳遞時,該陣列自動退化成同型別的指標:

void func(char a[100])

int main()

//輸出是8,(32位作業系統輸出是4)

參考這篇寫的超級全面細緻(強烈推薦)

C 探幽 指標引數

不要用return語句返回指向 棧記憶體 的指標,因為該內存在函式結束時自動消亡。char getstring void int main 區域性變數儲存在棧中,區域性變數的生命週期是有限的,函式退出的時候會釋放,所以這裡返回的指向棧的指標是危險的。改寫成如下示例 char getstring2 v...

指標與陣列的對比

陣列的位址與容量在生命期內保持不變,只有內容可以改變 指標可以隨時指向任意型別的記憶體塊.2 不能對陣列名進行直接複製與比較。如不能用語句b a,把陣列a的內容複製給陣列b.否則產生編譯錯誤.應該用strcpy,同理比較b和a的內容是否相同,不能用if b a 來判斷,應該用標準庫函式strcmp進...

C語言陣列與指標對比

前面兩篇博文分別介紹了陣列與指標的知識,本篇將主要介紹兩者的聯絡與區別。希望對初學者有所幫助。分別定義乙個陣列與乙個指標變數,如下 int sarr 10 char ptr abcdefghi 通過下標訪問 通過間接訪問運算子 訪問 指標是左值 除非宣告為const 其值可以更改,陣列名是右值,其值...