char s 和 char s 的區別

2021-09-25 10:02:25 字數 2227 閱讀 3689

最近的專案中有不少c的程式,在與專案新成員的交流中發現,普遍對於char *s1 和 char

char *s1 = "

hello";

char s2 = "

hello";

【區別所在】

char *s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。

char

s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡不會改變,只有陣列的內容可以改變

【記憶體模型】

+-----+ +---+---+---+---+---+---+s1: | ******=> | h | e | l | l | o |\0 |

+-----+ +---+---+---+---+---+---+

+---+---+---+---+---+---+s2: | h | e | l | l | o |\0 |

+---+---+---+---+---+---+場景一)

char *s1 = "

hello";

char s2 = "

hello";

s2=s1; //

編譯error

s1=s2; //ok

場景二)

char s2 = "

hello";

char *s1 = s2; //

編譯器做了隱式的轉換 實際為&s2

或char *s1 = &s2;

分析:以上兩個指標復值完全等價,由於編譯器會做這個隱式轉換也容易導致初學者誤認為

char *s 與char s是一回事。

另用第二種在一些編譯器甚至會報警告資訊。

場景三)

char *s1 = "

hello";

char s2 = "

hello";

s1[0]='

a'; //

×執行error( 這一句好像在一些的編譯器不會出錯,原因待查)

s2[0]='

a'; //

ok分析:執行時會報錯,原因在於企圖改變s1的內容,由於s1指向的是常量字串,其內容是不可修改的,因此在執行時不會通過。而s2指向的是變數區字串,可以修改。

場景四)

讓我們來給乙個指標的指標賦值,在使用某些含char**引數的函式時會用到,場景二的增強版。

char *s1="

hello";

char s2="

hello";

char *s3=s2; //

★注意這句必須要★

char **s4=&s3; //

s2(char)要用兩步才能完成賦值

char **s5=&s1; //

s1(char*) 只需一步

printf("

s4=[%s]\n

",*s4);//

列印結果:s4=[hello]

printf("

s5=[%s]\n

",*s5);//

列印結果:s5=[hello]

分析:這個例子應當說最能反映出char *與char 的差異,但是由於使用場合不多,新人尤其需要注意。

下面是一些char *s1 和 char

s2相同的地方(同樣編譯器對char做了隱式變化):

1)作為形參完全相同

如:

void function(char *s1);

void function(char

s1); 2

)只讀取不修改的時候

如:

char *s1="

hello";

char s2="

hello";

printf(

"s1[1]=[%c]\n

",s1[1]); //

s1[1]=[e]

printf("

s2[1]=[%c]\n

",s2[1]); //

s2[1]=[e]

printf("

s1=[%s]\n

",s1); //

s1=[hello]

printf("

s2=[%s]\n

",s2); //

s2=[hello]

from:

char s 和 char s 的區別

char d hello 中的a是指向第乙個字元 a 的乙個指標 char s 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標。現執行下列操作 strcat d,s 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法修的。而陣列是存放在...

char s和char s 的區別

char str1 hello char str2 hello 我們說這個是定義而不是宣告,是因為定義在記憶體裡面分配了房子。而宣告,只給了個房產證卻不給你分房子。str1 是 char 型別 它是乙個指標,這個指標指向乙個字串。str2 是 char 型別。它是乙個陣列,他代表了這堆記憶體空間。h...

char s 和 char s 的區別小結

char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...