1.先來看乙個程式:
char flower[10] = "roses"; //陣列
char *s = "red"; //從這裡看出"red"實際是乙個位址,並將位址賦給了指標s
cout
<< flower << " are "
/" are "作為字串常量
執行結果:
cout物件乙個是陣列名flower,乙個是字串常量「s are red」
首先需要知道的是陣列名是乙個指向字串第乙個字元的位址,因此flower是包含字元r的char元素的位址,cout物件是flower,就選擇列印該位址處的字元,並且繼續列印,知道遇到空字元(\0);
同乙個cout對物件處理的應該是一樣的,因此字串常量也應當是乙個位址,並且是第乙個元素s的位址;
現在有乙個指向char型別的指標s,那當指標作為cout物件時,也是用同樣的處理方法;
char animal[20] = "bear";
char *ps;
cin >> animal;
ps = animal; //animal賦值給ps的是位址而不是字串,所以這兩個指標指向了相同的位址
cout
<< ps
<< animal << (int*)animal << endl;
cout
<< ps << (int*)ps << endl;
ps = new
char[strlen(animal) + 1]; //建立乙個副本,讓ps指向新的位址
strcpy_s(ps,strlen(animal)+1, animal);
cout
<< animal << (int*)animal << endl;
cout
<< ps << (int*)ps << endl;
deleteps;
執行結果:
cout物件時指標,原本應該列印位址,但當指標型別是char時,將列印指標指向的字串。此時如果想要顯示字串的位址,需要進行強制型別轉化,如(int *)
下面是我在使用strcpy_s時遇到的小bug:
strcpy_s(ps,strlen(animal), animal);//這是我一開始寫的
問題出現在對strlen()的使用,這個函式計算的字串長度是不包括』\0』的,所以在設定第二個引數(緩衝區長度)時,就會出現異常,因為在拷貝時需要將字串的結束標誌也要一同拷貝過去,所以,上面提示buffer is too small就表明第二個引數設定的值小於源字串。所以解決方法就是:將strlen(animal)修改為strlen(animal)+1,如下圖,修改後除錯通過。
strcpy_s(ps,strlen(animal)+1, animal);
字元指標與字串
例項1 include using namespace std int main 執行結果 error 例項2 include using namespace std int main 執行結果 helloworld例項3 include using namespace std int main 執...
字串與指標
字元 0 和 0 的區別字元 0 對應的ascii碼為十六進製制30 而 0 即為ascii碼中的0,其對應字元空字元nul。char c 0 char c 0 nul char c 0 char c 48 最典型如memset函式 void memset void buffer,int ch,si...
字串與指標
printf的第二個引數的型別是由 第乙個引數format決定的。當format為 s時,第二個引數就是乙個位址,printf將位址上的值輸出到stdout。當format為 d時,第二個引數就是乙個int型的變數,printf將變數上值輸出到stdout。1 字串的表示形式 在c語言中,我們可以用...