char* s1=」abc」;s1是乙個指標,s1所指向的位址的內容是不可改變的,但是s1可以指向其他位址。s1是指向字串常量的,它儲存在裡不可被修改。
如下:
char* s1="abcd";
s1[2]='z'; //錯誤:編譯時能通過執行的時候會報錯
s1="xyz"; //可以將指標指向其他內容
cout如下:char s2="efgh";
s2="xyz"; //出錯:s2不可以再指向其他內容
cout《若是將指標指向乙個陣列,那麼這個陣列即可以被改變元素值又可以被指向其他字串。如下:
char *p=s2;
p[0]='x'; //可以改變元素值
p="rty"; //可以指向其他字串
cout《這種既能改變元素值又能重新指向其他字串的方式與string定義的字串功能很相似。
注意,可以p = s2,但不可以s2 = p,且陣列名可以賦值給指標表示位址,但是卻不能賦給陣列名,它是乙個常量型別,所以不能修改。
char *與char a 的本質區別:
1)當定義char a[10]時,編譯器會給陣列分配十個單元,每個單元的資料型別為字元,sizeof(a) = 10
2)而定義char *s 時,這是給指標變數,只佔四個位元組,32位,用來儲存乙個位址。sizeof(s) = 4
printf("%p", s); // 這個表示s的單元中所儲存的位址
printf("%p", &s); // 這個表示變數本身所在記憶體單元位址,不要搞混了
char 與char 的區別
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於 資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料 結構中的堆是兩回事,分配方式倒...
char 與 char 的區別
hello world 作為靜態字串實際上儲存在資料區,但寫程式的人不知道這個位址,而程式本身知道。當某一函式以 方式使用此靜態字串時,實際上相當於 char p 12 strcpy p,hello world p 12 是在棧裡臨時分配的。雖然p指向的內容是 hello world 但是這是複製品...
關於char 與char 的區別
char a在執行時賦值,值會從靜態區賦值到函式的棧中,對它進行修改不會產生任何問題。char a在編譯時就確定了,a指向靜態區中的值,沒有賦值到函式棧中,因此對指標的內容進行修改會產生錯誤。和許多文章一樣,還是先來了解一下 乙個由 c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stac...