【C语言进阶深度学习记录】十二 C语言中的:字符和字符串
文章目錄
- 1 C語(yǔ)言中的單引號(hào)和雙引號(hào)
- 1.1 雙引號(hào)帶來(lái)的BUG
- 2 總結(jié)
1 C語(yǔ)言中的單引號(hào)和雙引號(hào)
- C語(yǔ)言中的單引號(hào)用來(lái)表示字符字面量
- C語(yǔ)言中的雙引號(hào)用來(lái)表示字符串字面量,存儲(chǔ)于全局的只讀存儲(chǔ)區(qū)
注意上面的字符與字符串的區(qū)別
- 下面的程序片段是否合法?
上面額三行代碼,看著像是很正常,實(shí)際上問(wèn)題很大。在具體分析上述代碼問(wèn)題之前,我們先給出一個(gè)代碼示例來(lái)看看:
- 代碼 14-1.c
-
上述代碼編譯結(jié)果如下:
-
在程序員的眼中,警告就是錯(cuò)誤上述錯(cuò)誤提示告訴我們6行,7行,12行有問(wèn)題。
-
運(yùn)行上述可執(zhí)行程序的話,會(huì)產(chǎn)生段錯(cuò)誤
由以上的程序以及編譯與運(yùn)行的情況來(lái)看,由以下幾條知識(shí)點(diǎn)需要我們掌握:
- 字符字面量,被編譯為對(duì)應(yīng)的ASCII碼
- 字符串字面量,被編譯為對(duì)應(yīng)的內(nèi)存地址
- printf() 的第一個(gè)參數(shù),被當(dāng)成是字符串的內(nèi)存地址
- 內(nèi)存的低地址空間,不能被隨意訪問(wèn)。至于這一點(diǎn),如下內(nèi)存圖所示:
如上圖所示:
-
p1變量的值是0x00000001,地址1是無(wú)法訪問(wèn)的。所以第6行有警告 。 地址0x00000001為什么不能訪問(wèn)可以自行g(shù)oogle
-
p2變量的值是字符‘1’的ASCII碼,也就是31,地址0x00000031也是不能被訪問(wèn)的。(第一條與第二條就印證了內(nèi)存低地址不能被訪問(wèn)的說(shuō)法)
-
p3變量的值是字符串“1” 所代表的地址,在這里是0x080484d0 。 這個(gè)地址是可以被訪問(wèn)的。
-
至于第12行的警告,是因?yàn)?‘\n’ 的ASCII碼值為 10 ,那么printf 的第一個(gè)參數(shù)就是 10 ,10這個(gè)地址同樣也是不能被訪問(wèn)到的。
1.1 雙引號(hào)帶來(lái)的BUG
代碼:14-2.c
#include <stdio.h>int main() {char c = " ";while( (c == "\t") || (c == " ") || (c == "\n") ){scanf("%c", &c);}return 0; }- 上述代碼乍一看沒(méi)問(wèn)題,但是編譯運(yùn)行會(huì)發(fā)現(xiàn)有警告,且運(yùn)行后并不會(huì)執(zhí)行while循環(huán)。
- 主要原因是雙引號(hào)下空格,表示一個(gè)地址的值。一個(gè)地址值是占用4字節(jié)的,但是字符c是一字節(jié)的,會(huì)產(chǎn)生截?cái)?/li>
- 因?yàn)榻財(cái)嗔恕K詗hile循環(huán)不會(huì)成立
2 總結(jié)
- 單引號(hào)括起來(lái)的單個(gè)字符代表整數(shù)
- 雙引號(hào)括起來(lái)的字符代表字符指針
- 如果使用字符串對(duì)字符賦值,就會(huì)得到錯(cuò)誤的結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【C语言进阶深度学习记录】十二 C语言中的:字符和字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mpls工作原理通俗解释_用这两种方法向
- 下一篇: python 线程超时设置_python