1. 程式人生 > >常量字串,字串變數——儲存位置

常量字串,字串變數——儲存位置

注意:

指標方式建立的字元陣列,是常量字串,指標指向的內容是沒法更改的;方括號([])方式建立的字元陣列僅僅是變數,內容可以更改。

   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;
}