真是慚愧,都要上大四了才來補這個知識點。之前只學了c的時候字元陣列就是一塌糊塗,還沒搞懂的時候學了c++,後來基本都是用的string,沒有用過char*,今天又碰到了這個問題,一定要把他弄懂!!!
事情的起因是我給乙個char* str賦了初值,後來又嘗試改變它,但程式一直崩潰找不到原因,最難受的是編譯不會報錯,但執行就會崩潰。後來查資料發現char*指向常量的時候,常量是不能夠被修改的,這估計也是他們兩個最大的區別了
總結如下:
陣列表示一塊記憶體區域,其位址和容量在生命期裡不會改變,只有陣列的內容可以改變,賦值是在執行時進行的
指標指向一塊記憶體區域,而指標卻不同,它指向的記憶體區域的大小可以隨時改變,賦值是在編譯時進行的,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。
//編譯不會儲存,但執行會崩潰,因為試圖修改s1的內容,但是指標s1指向的是常量,不能修改
#include#include#includeint main(void)
//可正常被修改
#include#include#includeint main(void)
//執行結果為 123456789 123456
陣列儲存在棧區,系統會自動為其分配記憶體
指標儲存在堆區,需程式設計師自己進行釋放。如果只有定義,沒有用char* sp=a;指向某個具體陣列,則使用之前必須用malloc為他手動分配記憶體,使用完後用free釋放
char *sp=(char*)malloc(sizeof(char)*(n));
這裡可以看看堆疊的區別:
用運算子sizeof可以計算出陣列的容量(位元組數),而用sizeof卻無法計算指標所指記憶體的容量,用sizeof(p)得到的結果永遠是4或者2(即指標變數所佔記憶體單元的位元組數,一般情況下指標變數佔2個或4個位元組的記憶體單元)。在進行引數傳遞時,陣列會自動退化為同型別的指標。
#include#include#includevoid function(int a)
int main(void) ;
int*p=a;
printf("%d %d\n",sizeof(a),sizeof(p));
function(a);
return 0;
}
輸出:
40 8
8
char str和char str 的區別
我在vs2008平台上編寫例程如下 viewcode 1 include stdafx.h 2 include 34 char reverse char str 5 11 char lastdata str len 1 保留最後乙個字元 12 str len 1 0 13 reverse str 1...
char str 和char str的區別
1 char ss c ss 0 c 合法 char p c p 0 c 合法但不正確 該段 在vs2010下編譯可以通過,但是執行時程式會停止工作,為什麼呢?原因在於p 0 c 這一語句。該語句試圖修改p指向的字串的首個字元,出現了錯誤。原因在於兩種方式對字元陣列操作的機制不同。使用char p ...
和 區別和聯絡, 和 區別和聯絡
和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...