指標與字串

2021-08-10 19:58:52 字數 1672 閱讀 5403

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語言中,我們可以用...