c++ 字串_C/C++每日一問為什麼字串可以賦值給字元指標變數?
技術標籤:c++ 字串c++ 字串中的字元無效c++ 指標c++ 私有變數是字串指標c++ 私有變數是字串指標賦值c++變數重新賦值
C/C++每日一問
點選上方「嵌入式龍憨憨」,選擇「置頂/星標公眾號」第一時間檢視程式設計筆記!
特別設定【每日一問】專欄,對專業課--C/C++的複習的學習成果進行實踐檢驗以及知識拓展,裂變自己接觸和學習過的知識及技巧;主要是理論和實踐相結合,以基礎知識為主,實踐操作為輔,保證學習效果,和大家一起回顧知識,共同進步,加油!
特別提示:【每日一問】欄目包括但不限於【今日主題】、【實踐演練】、【知識裂變】等模組,內容比較基礎,適合新手學習以及熟手進行知識回顧,大神勿噴,請自動繞道,謝謝!
1
今日主題
有以下程式碼:
typedefchar*PCHAR;PCHARp1= 'a';//1PCHARp2="Hello";// 2PCHAR p3;charname[5]="John";p3=name;// 3
1、2、3條語句是否合法?
語句1不合法,語句2和3均合法。
由上可知,不能將字元賦值給字元指標變數,可以將字串賦值給指標變數。為什麼呢?
2
實踐演練
為什麼不能將字元賦值給字元指標變數,可以將字串賦值給指標變數呢?
1、單引號和雙引號
1.1簡介
C語言中的單引號用來表示字元字面量
C語言中的雙引號用來表示字串字面量
如:
'a'表示字元字面量 ,在記憶體中佔1個位元組
'a'+1表示'a'的ASCII碼加1, 結果為'b'
"a"表示字串字面量 ,在記憶體中佔2個位元組
"a"+1表示指標運算,結果指向"a"結束符'\0'
1.2資料長度
單引號:單引號的資料長度固定,因為只有一個字元,所以資料長度為1。
雙引號:雙引號的資料長度不固定,由字串的字元數量決定。
2、具體分析
PCHAR p1 = 'a';// 1
單引號中的一個字元實際上代表一個整數,'a'對應ASCII碼的97,所以將一個整數賦值給指標變數初始化是不對的,指標變數需要用地址進行初始化。
語句1可以改寫為以下程式碼,就是正確的。
charc='a';PCHARp1=&c;//1
PCHAR p2 = "Hello";// 2
語句2,"Hello"表示式使用的值就是這些字元所儲存的地址(在常量區),而不是這些字元本身。
雙引號做了3件事:
1.申請了空間(在常量區),存放了字串
2. 在字串尾加上了'/0'
3.返回首字元地址
這裡將返回的地址賦值給了p2,所以可以用字串賦值給字元指標變數。
3、小結
單引號中的單個字元為字元字面量,被編譯為對應的ASCII碼,代表整數;
雙引號中的字元為字串字面量,被編譯為對應的記憶體地址,代表字元指標(即地址)。
所以可以用字串對字元指標變數進行初始化賦值。
3
知識裂變
1、typedef 關鍵字1.1作用:
為一種資料型別定義一個新名字。這裡的資料型別包括內部資料型別(int,char等)和自定義的資料型別(struct等)。
在程式設計中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較複雜的型別宣告。
typedef char* PCHAR;
將PCHAR定義為char*的別名,看到PCHAR就相當於char*;
2、語句3中的知識點
CHAR p3;char name[5] = "John";p3 = name;// 3
語句3先對陣列name用字串初始化,name是陣列名,代表陣列的首地址,所以是可以賦值給字元指標變數的。
但是如果換種寫法:
char name[5]name ="John";
經典的錯誤,絕對的零分!
“John”賦的值是一個地址,而name雖然也有地址,但是和指標有所不同。
指標的值是地址,而陣列的值雖然也是地址,但是卻是一個常量,所以不能給常量賦值。
長按圖片關注分享技術,碼字不易
轉發、在看就是我最大的動力
置頂/星標公眾號,和我一起學習吧