char str和char str 的區別

2021-10-24 07:09:57 字數 1269 閱讀 6597

真是慚愧,都要上大四了才來補這個知識點。之前只學了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 ...