常量字串,字串變數——儲存位置
阿新 • • 發佈:2019-02-10
注意:
指標方式建立的字元陣列,是常量字串,指標指向的內容是沒法更改的;方括號([])方式建立的字元陣列僅僅是變數,內容可以更改。
string 物件沒有 ‘\0’
char text[] 字串陣列若沒有 '\0',只能當做陣列處理,若有 '\0',可以看做字串,可以cou<<text,否則不可以。
字串陣列
用字串初始化字元陣列時,或是char型指標指向字串時,"\0"附帶在後面與前面的字元一起作為字元陣列的元素。
在記憶體中,就是根據"\0"來確認字串,如果找不到就會沿著字元一直找下去。它佔用記憶體空間,但是不計入串長。
用字串初始化字元陣列時,系統會在字元陣列的末尾自動加上一個字元"\0",因此陣列的大小比字串中實際字元的個數大。如:sizeof(str1)=strlen(str1) +1;
sizeof會計入‘\0’,strlen不會
參見另外一篇部落格:http://blog.csdn.net/bxw1992/article/details/77193787
#include<iostream> using namespace std; int a = 0; //全域性初始化區(data段) char *p1; //全域性未初始化區(bss段) int main() { int b; //棧 char s[] = "abc"; //棧,s是字串變數,後面帶 \0 char *p2; //棧 char *p3 = "123456"; //123456\0在常量區,p3在棧上,p3是常量指標,指向的內容不能更改 static int c = 0; //全域性(靜態)初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20);//分配得來得10和20位元組的區域就在堆區。 strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 cout << p3[0] << endl; s[0] = 'd'; //正確 p3[0] = '2'; //賦值出錯 system("pause"); return 0; }