字串與指標

2021-06-29 10:27:25 字數 2733 閱讀 7053

在c語言中,有兩種方式儲存字串,一種是字元陣列,另一種就是指標形式。

第一種,字元陣列

字元陣列儲存字串,可以借助陣列下標值訪問和修改字串中的任意乙個字元。

第二種:指標形式儲存字串

一、雙引號的作用:

1.申請了空間(在常量區),存放了字串 

2. 在字串尾加上了'/0'    

3.返回位址,返回的位址給p。

以字串形式出現的,編譯器都會為該字串自動新增乙個0作為結束符,如在**中寫

"hello world",那麼編譯器幫你存是"hello world\0"

二、 字串是否為常量(此段參考博文

1. 當字串定義在陣列中時不時常量,

"abc"作為字元陣列初始值的時候就不是,如

char str = "abc";

因為定義的是乙個字元陣列,所以就相當於定義了一些空間來存放"abc",而又因為

字元陣列就是把字元乙個乙個地存放的,所以編譯器把這個語句解析為

char str[3] = ; 

char str = "abc";的最終結果是

char str[4] = ;

如果char str = "abc";是在函式內部寫的話,那麼這裡

的"abc\0"因為不是常量,所以應該被放在棧上。

2. 是常量的情況:

把"abc"賦給乙個字元指標變數時,如

char* ptr = "abc";

因為定義的是乙個普通字元指標,並沒有定義空間來存放"abc",所以編譯器得幫我們

找地方來存放"abc",顯然,把這裡的"abc"當成常量並把它放到程式的常量區是編譯器

最合適的選擇。所以儘管ptr的型別不是const char*,並且ptr[0] = 'x';也能編譯

通過,但是執行ptr[0] = 'x';就會發生

執行時異常

,因為這個語句試圖去修改程式

常量區中的東西。用這個類子給大家解釋解釋.

對於char str = "abcdef";就有sizeof(str) == 7,因為str的型別是char[7],

也有sizeof("abcdef") == 7,因為"abcdef"的型別是const char[7]。

對於char *ptr = "abcdef";就有sizeof(ptr) == 4,因為ptr的型別是char*。

對於char str2[10] = "abcdef";就有sizeof(str2) == 10,因為str2的型別是char[10]。

對於void func(char sa[100],int ia[20],char *p);

就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,

因為sa的型別是char*, ia的型別是int*,p的型別是char*。

定義乙個字元指標,不能試圖通過下標值直接修改,譬如:char *p = "hello world";p[0] = 'h';這段**是錯誤的。要想修改,這樣寫char a[12] =

"hello world";char *p = a; p[0]='h';printf("%s\n",p);

定義的字串方式舉例:

字串定義其實很簡單在c/c++語言中定義乙個字串可以使用如下的語法:

char *s1=「string1」;//定義字串常量,指標形式

char s2=「string2」;//定義字串常量,陣列形式

char *s3=new char[10];//定義字串變數並分配記憶體 指標形式

strcpy(s3,"string3");//為s3賦值

char s4[10];//定義字串變數,陣列形式

strcpy(s4,"string4");//為s4賦值

以上四種方法都能定義乙個字串,同時通過字串在記憶體中的分布可以清楚地知道是什麼情況

採用指標儲存字串,其實質就是把字串的首地值附給基型別為char的指標變數,從而可以從字串首元素開始對字串進行操作,這裡面也存在一點問題.

int main()

執行結果會出現斷錯誤,原因在於,*p="hello world" 這句僅僅宣告了乙個指標變數,指向字串"hello world",而"hello world"這個字串程式沒有給它分配空間,編譯器把它分配到常量區.而常量字串的值是不允許被修改的 ,所以會出現斷錯誤.

程式改為如下就正確了

int main()

原因在於,p[12]="hello world"是你自己定義的乙個長度為12 的字元陣列,所以字串"hello world"編譯器會給它分配空間(在棧中),所以你能修改它的值.

字元指標與字串

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