1. 程式人生 > 其它 >字串 字元陣列 char指標 ???

字串 字元陣列 char指標 ???

技術標籤:讀書筆記c++指標字串stringc語言

最近軒少閒來無事,乘爽妹子,華晨宇,楊紫這些頂流明星攢了一波大瓜,讓微博程式設計師痛苦加班之際,又拿起C++研究了一番,對字串略有所感,在此記錄一下。
大部分學c/c++的人都是從

printf("Hello, World!");
cout << "Hello, World!" << endl;

開始。"Hello, World!"是一個字串常量,它是read-only的,所以當你使用

char *str = "Hello";
str[
1] = 'a';

時,當一執行程式碼程式就會提醒你寫了一塊只讀的區域
在這裡插入圖片描述
所以,當使用字串常量時不如給它加上const限定,在編譯階段就能提醒自己這個變數時不可改變的。比如這樣

const char *str = "Hello";
str[1] = 'a';	/* vs中有紅色下劃波浪線提示 */

字串實際上就是一個字元陣列,和所有的陣列一樣,在記憶體中有一個結束標誌來標記字串的結束即 ‘\0’,所以當執行const char *str = “Hello”;記憶體中的分佈大致如在這裡插入圖片描述
字串常量會自動新增 ‘\0’ 來作為結束,作為比較

const char *str = "Hello"
; const char str1[5] = {'H', 'e', 'l', 'l', 'o'}; cout << str << endl; /* Hello */ cout << str1 << endl;/* Hello燙燙燙燙燙談? */

而當你想要獲得一個字串的長度,其實就是要找起始指標地址到 \0 前的字元個數,c標準庫中有strlen這個函式來實現這個功能。
在實際工程中,對字串有頻繁的copy,append,modify等操作,c++中使用string類來支援這些操作。
string 的使用方法也很簡單

const char *str = "Hello"
; >> string str = "Hello";

別忘了包含標頭檔案。string 會動態得為字串申請空間,比如hello實際上是一個 const char [6] 型別。
使用 string 可以很方便得連線和查詢字串,比如

string s = string("hello") + "world";
bool contains = s.find("hello") != string::nops;

注意

string s = "hello" + "world"; /* Error 字元陣列相加*/

前面說到 string 實際上被宣告成了一個字元陣列,所以當 strintg 作為引數被傳遞時

void fun(string s);

會拷貝整個字元陣列,這樣引數壓棧的開銷較大,所以一般使用string應用來傳遞引數,如果同時不想字串被子函式修改,則可將函式宣告為

void fun(const string &s);

以上就是關於字串的一些簡單用法,事實上 string 提供了一套十分豐富且強大的字串操作函式,關於這些函式我們下一節再聊。