C++字符串常量总结(包含表达式必须是可修改的左值问题)
C++字符串常量總結(包含表達式必須是可修改的左值問題)
- 字符串常量與雙引號
- 字符串常量的保存與使用
- 字符數組(必須是可修改的左值原因)
- 字符串指針(表達式必須是可修改的左值解決辦法1)
- 字符串變量(string,表達式必須是可修改的左值解決辦法2)
- 補充
引用參考,感謝各位大佬,另外還有閱讀了書籍《C++程序設計》譚浩強編著。
https://blog.csdn.net/JQ_AK47/article/details/53169799
https://www.runoob.com/w3cnote/cpp-string-array-pointer.html
https://blog.csdn.net/weixin_41498246/article/details/103322225
字符串常量與雙引號
在 C 語言中,將字符串作為字符數組來處理,而C++中不是。
C++中,用雙引號括起來的字符就是字符串常量,如“abc”,“hello”,“a+b”都是字符串常量。
雙引號做了3件事:
1.申請了空間(在常量區),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
例:
這里的字符串常量“Wang_li”看起來是7個字符,但是在內存中占8個字節,字符串最后自動加上了一個‘\0’作為字符串結束標志。在為字符串設置內存空間時一定要注意這一點。
字符串常量返回的是地址,而不是Wang_li\0,因此它可以賦值給指針而無法在已經定義好字符串變量后再賦值給字符串變量,后面細寫。
它是常量,因此是const char[],而不是char[],
字符串常量的保存與使用
字符數組(必須是可修改的左值原因)
1、用字符串常量來初始化字符數組
char name1[] = { "Wang_li" };char name2[] = "Wang_li" ;char name3[10] = "Wang_li";char name4[10]= { 'W','a','n','g','_','l','i'}; //補充C++允許用這種方式初始化字符數組,雖然字符串變量返回的是地址。
但需要注意的是,字符數組的賦值只能對字符數組的各元素逐個賦值,不能用賦值語句對整個數組一次賦值。
定義的char Name[10] ,是一個字符數組,在定義完成之后,系統會分配一段內存,這段內存的地址賦值給name,給name的這個內存地址是一個常量。
而name = "Wang_li"不行,"Wang_li"賦值的值是一個地址,而name雖然也是地址,但是這與指針是不一樣的,指針的值是地址,而數組的值雖然也是地址,但是卻是一個常量,所以不能給常量賦值。
但C++支持用字符串常量初始化,初始化相當于一個一個元素賦值。
運算符的左邊應該是一個“左值”。所謂“左值”就是指在程序中占用內存空間、可以被修改的量,比如各種變量。
解決辦法見指針小節。
在字符串實際長度和數組長度不等的時候,系統對字符數組最后的元素自動填補空字符‘\0’,注意,不是空格字符。在程序中往往依靠檢測‘\0’的位置來判定字符串是否結束,而不是根據數組的長度來決定字符串長度。
2、首先定義字符數組(必須確定字符數組的長度),用cin從鍵盤向計算機輸入一個字符串。
char str[10];cin>>str;字符串指針(表達式必須是可修改的左值解決辦法1)
字符串常量已經在常量區存放了,返回地址,因此定義一個字符串常量指針變量指向這個字符串常量就可以使用了。例
const char *name ;name = "Wang_li";const char *name2= "Wang_li";可以直接初始化,也可以先定義指針變量再賦予字符串常量的地址,這種先定義再賦值的方法很適合在C++的類定義里使用。
必須是可修改的左值解決辦法:
總結:將字符串常量的返回值理解為地址,使用指針變量指向字符串常量就可以了。注意字符串常量是存儲在常量區的,是const char類型,因此指針是constant char *類型的。(VS2017需要這么寫,不過書上可以用char *指向字符串常量,大概是低版本支持,到高版本不支持了。)
字符串變量(string,表達式必須是可修改的左值解決辦法2)
C++提供了一種新的數據類型——字符串類型(string類型),string并不是C++的基本類型(像char,int,float都是基本類型),它是C++標準庫中聲明的一個字符串類,每一個字符串變量都是string類的一個對象。
在使用string類定義變量時,必須在文件開頭將string頭文件包含進來
定義字符串變量和賦值。注意,定義字符串變量時不需指定長度,它的長度隨其中的字符串長度而改變,如果指定長度反而可能出現“表達式必須是可修改的左值”問題。
string string1; //定義字符串變量時不需指定長度 string string2="China";string1="China"; //可以先定義后賦值同樣針對之前舉例的定義類時的表達式必須是可修改的左值問題:
#include <string> //用string類必須包含這個頭文件 class Student { public:Student(int n,string nam){num = n;name = nam;} private:int num;string name; };Student stud1(10010, "Wang_li");如果仍然又表達式必須是可修改的左值問題,可以觀察一下其他細節,比如[n]的有無,string不加[n]的,但const char* name[10]在定義類時就需要。
補充
如果在一個字符串中最后一個字符為“\”,則表示它是續行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格。如
cout << "You are so\oooo cute";輸出的是You are sooooo cute
總結
以上是生活随笔為你收集整理的C++字符串常量总结(包含表达式必须是可修改的左值问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解yarn的作业提交流程
- 下一篇: QT中this指针