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
分析:s2其位址和容量在生命期裡不能改變
場景二)
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]
2023年3月19日 16:03:06 新增
char*char1 = "char1";
char
char2 = "char2";
char1 = "char11";
//char2 = "char22";
char2[0] = 'a';
//char1[0]='a';
cout
<<*char1
<<&char1
<<分析:這個例子應當說最能反映出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]
char s 和 char s 的區別小結
char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...
char s 和 char s 的區別小結
char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...
char s 和 char s 的區別小結
char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...