欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
“C/C 中char* 和 char「」區別

來(lái)源 :今日頭條@技術(shù)小白學(xué)習之路

首先我們先看看他們之間的相同點(diǎn)

1、這兩種類(lèi)型都可以對應一個(gè)字符串,比如:

char * a=”hello1”; char b[]=”hello2”; printf(“a=%s, b=%s”, a, b); 

其中a是一個(gè)指向char變量的指針,b則是一個(gè)char數組(字符數組),
其次 ,很多時(shí)候二者可以混用,像函數傳參數的時(shí)候,實(shí)參可以是char*,形參可以是 char[],比如:

void fun1(char b[]){ printf(“%s”,b); } int main(){ char *a=“HellowWorld”; fun1(a); }

反過(guò)來(lái),實(shí)參可以是char[],形參可以是 char *也是可以的。

2、他們都是以'\0'結尾;(注意不同的求長(cháng)度函數對他們的處理不同,有的計算'\0',有的沒(méi)有計算);

strlen()是取字符串除去結尾符 “\0” 的長(cháng)度;
sizeof()是包含‘\0’的長(cháng)度
存在即合理,char *和char[]肯定是有本質(zhì)的不同

接下來(lái)查看他們的不同點(diǎn):

1.char*是變量,值可以改變;

char[]是常量,值不能改變。

如下:

char * a=”string1”; char b[]=”string2”; a=b; //OK a=”string3”; //OK b=a; //報錯!左邊操作數只讀 b=”string3” //報錯!左邊操作數只讀

解釋?zhuān)篴是一個(gè)char型指針變量,其值(指向)可以改變;
b是一個(gè)char型數組的名字,也是該數組首元素的地址,是常量,其值不可以改變 。

2、char[]對應的內存區域總是可寫(xiě),char*指向的符號常量不能寫(xiě)

char *p = 'sample';*(p + 4) = '1';//程序會(huì )崩潰

崩潰的原因在于char*定義的p是在棧中分配的一個(gè)指針,“sample”是一個(gè)在靜態(tài)區分配了一塊常量區,指針p指向了這塊常量去,常量去是無(wú)法進(jìn)行數據的更改的,所有在試圖更改“sample”的時(shí)候程序會(huì )崩潰。

char a[] = 'sample'; a[1] = 'b'; printf('a=%s\n', a);

程序可以正常運行,可以發(fā)現數組a的值成功的被改成了“sbmple”。

3.char * 和char[]的初始化操作有著(zhù)根本區別:

測試代碼:

char *a=”Hello World”; char b[]=”Hello World”; printf(“%s, %d\n”,”Hello World”, “Hello World”); printf(“%s, %d %d\n”, a, a, &a); printf(“%s, %d %d\n”, b, b, &b);

結果:


結果可見(jiàn):盡管都對應了相同的字符串,但”Hellow World”的地址 和 a對應的地址相同,與b指向的地址有較大差異;&a 、&b都是在同一內存區域,且&b==b
根據c內存區域劃分知識,我們知道,局部變量都創(chuàng )建在棧區,而常量都創(chuàng )建在文字常量區,顯然,a、b都是棧區的變量,但是a指向了常量(字符串常量),b則指向了變量(字符數組),指向了自己(&b==b==&b[0])。

說(shuō)明以下問(wèn)題:

char * a=”string1”;實(shí)現了3個(gè)操作:

1、聲明一個(gè)char*變量(也就是聲明了一個(gè)指向char的指針變量)。
2、在內存中的文字常量區中開(kāi)辟了一個(gè)空間存儲字符串常量”string1”。
3、返回這個(gè)區域的地址,作為值,賦給這個(gè)字符指針變量a

最終的結果:指針變量a指向了這一個(gè)字符串常量“string1”

(注意,如果這時(shí)候我們再執行:char * c=”string1”;則,c==a,實(shí)際上,只會(huì )執行上述步驟的1和3,因為這個(gè)常量已經(jīng)在內存中創(chuàng )建)
char b[]=”string2”;則是實(shí)現了2個(gè)操作:

1、聲明一個(gè)char 的數組,
2、為該數組“賦值”,即將”string2”的每一個(gè)字符分別賦值給數組的每一個(gè)元素,存儲在棧上。

最終的結果:“數組的值”(注意不是b的值)等于”string2”,而不是b指向一個(gè)字符串常量

實(shí)際上, char * a=”string1”; 的寫(xiě)法是不規范的!

因為a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,試圖向只讀的內存區域寫(xiě)入,程序會(huì )崩潰的!盡管VS下的編譯器不會(huì )警告,但如果你使用了語(yǔ)法嚴謹的Linux下的C編譯器GCC,或者在windows下使用MinGW編譯器就會(huì )得到警告。

所以,我們還是應當按照”類(lèi)型相同賦值”的原則來(lái)寫(xiě)代碼:const char * a=”string1”;

保證意外賦值語(yǔ)句不會(huì )通過(guò)編譯。

小結

const char * a=”string1” char b[]=”string2”;

1、a是const char 類(lèi)型, b是char const類(lèi)型
2、a是一個(gè)指針變量,a的值(指向)是可以改變的,但a只能指向(字符串)常量,指向的區域的內容不可改變;
3、b是一個(gè)指針常量,b的值(指向)不能變;但b指向的目標(數組b在內存中的區域)的內容是可變的
4、作為函數的聲明的參數的時(shí)候,char []是被當做char *來(lái)處理的!兩種形參聲明寫(xiě)法完全等效!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
關(guān)于函數返回值為指針類(lèi)型的分析
字符指針、字符數組用法大總結(字符串處理)
數組與指針,字符串賦值
[收藏]C++ Tips(1)--const - 心如止水--coofucoo的專(zhuān)欄
csdn(18條消息) 2021版C++教程,C++進(jìn)階教程(最全C++教程)
C 字符串
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久