無意中發現了乙個很有意思的技術型別小品文系列,通過大牛指導菜鳥的方式,講解講c++知識,有的很基礎卻是開發中容易忽略的地方。
【elminster的專欄】
【solmyr 的小品文系列之一:字串放在**? 】
**至此,給出鏈結,原文就不貼了,總結並擴充套件一下方便以後回顧。
字元陣列(char[ ])是元素為字元變數的陣列,字串(char *)是以 '\0' 為結束字元的字元陣列。對於字串來說,是可變長的,所以需要乙個字元來標記結束,就是 '/0'。char* 也表示字元指標。
如果用乙個字串字面常量來初始化乙個字元陣列,得到的陣列的長度要比字串字面常量的長度大1,用來存放'\0'。
char arr1 = "hello";
cout << sizeof(arr1) << endl; //output: 6
對於字元陣列來說,它並不在乎中間或者末尾有沒有'\0',因為它知道自己的長度,而且'\0'也是乙個合法的元素。但是我們經常會把字元陣列當做字串來用(字元陣列作為字串的緩衝區等),比如使用字元指標來引用乙個字元陣列,作為引數傳給strlen()這樣的庫函式,而strlen卻假定你提供的是字串,即字元指標指向的空間的某個位元組放著乙個'\0',會造成訪問衝突或者其他不可預知的錯誤。所以保險起見,在字元陣列的末尾放個'\0'。
char arrchar_1 = ;
char arrchar_2 = "hello";
char *p = "hello";
cout << sizeof(arrchar_1) << endl; //5,陣列佔5個位元組
cout << strlen(arrchar_1) << endl; //2,字串長度為2
cout << sizeof(arrchar_2) << endl; //6
cout << strlen(arrchar_2) << endl; //5
cout << sizeof(p) << endl; //4,指標佔4個位元組
cout << strlen(p) << endl; //5,c++預設char* 表示字串
對字串的操作要使用strlen, strcpy, strcmp, strcat 這樣的庫函式。
下面這段**會遇到執行時錯誤。msg是乙個指標,c++不會為它分配記憶體,它指向字串常量 "begin" 。字面常量(各種進製的數字、字元、字串)都只能引用,不能修改,一般被儲存在程式的符號表中,而不是在資料區中。當試圖去修改唯讀的字串時,就會出錯。但執行時錯誤只發生在debug版本中,在release版本中可以順利通過,msg仍然指向"begin",實際上msg的型別可以被認為是const char*。
char* msg = "begin";
strcpy(msg, "end");
有的聯結器自動執行常量合併,str1和str2指向的其實是同一塊記憶體。有的聯結器提供了常量合併的開關。
char* str1 = "begin";
char* str2 = "begin";
另外,在使用指標之前,應該確保這個指標指向合法的記憶體,要麼指向一塊已經存在的記憶體,要麼為它動態分配一塊記憶體。
char msg = "begin"; //為字元陣列分配連續的記憶體
char* pmsg = (char*)malloc(sizeof("end")); //顯示動態分配記憶體
strcpy(pmsg, "end");
C 基礎之字元陣列和字串
無意中發現了乙個很有意思的技術型別小品文系列,通過大牛指導菜鳥的方式,講解講c 知識,有的很基礎卻是開發中容易忽略的地方。elminster的專欄 solmyr 的小品文系列之一 字串放在 至此,給出鏈結,原文就不貼了,總結並擴充套件一下方便以後回顧。字元陣列 char 是元素為字元變數的陣列,字串...
C語言基礎 陣列和字串
本文介紹了c語言陣列和字串的基本知識。什麼是陣列 陣列,從字面上看,就是一組資料的意思,沒錯,陣列就是用來儲存一組資料的 陣列的特點 只能存放一種型別的資料,比如int型別的陣列 float型別的陣列 裡面存放的資料稱為 元素 陣列的定義 定義 宣告陣列的型別 宣告陣列的元素個數 需要多少儲存空間 ...
C基礎5 陣列和字串
0.陣列型別 是 由多個元素的組合。這多個元素的資料型別必須完全一樣。1.陣列是乙個構造型別,也是最基礎的構造型別了。2.陣列的個數如下 char a 5 char 是所有元素的資料型別。全部都是char a是陣列名,a是常量 但是不能執行a a a a 5 陣列有五個成員,分別是 a 0 a 1 ...