#include#includeusing namespace std;
int main()
//輸出結果
//0034ff10 0034ff10
//0034ff04 013bdc80
//char *str = "abcd";//先在文字常量區為"abcd"常量分配5b,接著在棧裡為指標str分配4b,並接收"abcd"字串的首位址
//char str = "abcd";//在棧區分配連續的5b,內容為'a','b','c','d',並把首位址標記為str
char*a = "123";//此時"123"在常量儲存區,a指向的記憶體的內容不能改變
cout << a << endl;
a = new char[5];//與char陣列不同的是,char*a可以指向別的記憶體,這裡的a現在指向堆區的記憶體了
strcpy(a, "456");//此時char*a的內容在堆中,a指向的記憶體的內容可以改變
//a = "456";//這裡是錯誤的賦值方法,使得a指向了常量儲存區(使得上面的new變得無效了),這裡只是給a賦值,應該用strcpy(a,"456")
cout << a << endl;
//給char*變數賦值的兩種方式:
//1、第一種
char* a1 = null;
a1 = "abc";
cout << a1 << endl;
//2、第二種
char*a2 = null;
char b[10] = "def";//b指向的記憶體的內容可以改變,但b不能指向別的記憶體
a2 = b;
cout << a2 << endl;
sizeof(a2);//值為4,表示指標a所佔的位元組
strlen(a2) + 1;//表示a所指內容所佔的位元組數
//char*接收控制台輸入的字串時,先要動態分配記憶體
char*a = null;
a = new char[5];
cin >> a;//如果輸入了超過4個字元,則屬於記憶體越界,但編譯器不會報錯
cout << a << endl;
char b[5];
cin >> b;//如果輸入了超過4個字元,則屬於記憶體越界,編譯器會報錯
cout << b << endl;
//關於b[5],呼叫的是templateoperator>>(t array[size])
//size在編譯期間已經是乙個確定的數值了。所以會進行錯誤檢測
//而char *a,呼叫的templateoperator>>(t*) 兩個函式根本不同
char *q = "hello";
const char* p = "hello";
char *p1= (char*)p;//const char*不能初始化char*,所以這裡需要強制型別轉換
char *const t = q; //這裡t是常量指標,定義的時候必須初始化,不能作為左值(不能被修改)
const char *const t2 = p;//t2也是常量指標,而且指向的字串不能被修改
C風格字串與C 風格字串
c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...
C風格字串與C 風格字串
c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...
C風格字串 字元陣列
char ch cout sizeof ch sizeof char endl 字元陣列元素個數 cout size ch endl 陣列長度 cout strlen ch endl 字元陣列元素個數,需在字元陣列後加 0 strlen 是c風格字串有的函式,返回字元陣列的長度,需要在字元陣列後加 ...