www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀] 一、可能的組合: ? ?? (1)const char*p ???? (2)char const*p ? ?? (3)char *const p ? ?? (4)const char **p

一、可能的組合:

? ?? (1)const char*p

???? (2)char const*p

? ?? (3)char *const p
? ?? (4)const char **p

? ?? (5)char const**p

? ?? (6)char *const *p

? ?? (7)char **const p

???? 當(dāng)然還有在(5)、(6)、(7)中再插入一個(gè)const的若干情況,不過(guò)分析了以上7中,其他的就可類(lèi)推了!

二、理解助記法寶:

? ???1。關(guān)鍵看const 修飾誰(shuí)。

? ???2。由于沒(méi)有const *的運(yùn)算,若出現(xiàn)const*的形式,則const實(shí)際上是修飾前面的。

???? 比如:char const*p,由于沒(méi)有const*運(yùn)算,則const實(shí)際上是修飾前面的char,因此char const*p等價(jià)于const char*p。也就是說(shuō)上面7種情況中,(1)和(2)等價(jià)。 同理,(4)和(5)等價(jià)。在(6)中,由于沒(méi)有const*運(yùn)算,const實(shí)際上修飾的是前面的char*,但不能在定義時(shí)轉(zhuǎn)換寫(xiě)成 const(char *)*p,因?yàn)樵诙x是"()"是表示函數(shù)。

三、深入理解7種組合

? ?? (0)程序?在執(zhí)行時(shí)為其開(kāi)辟的空間皆在內(nèi)存(RAM)中,而RAM里的內(nèi)存單元是可讀可寫(xiě)?的;指針只是用來(lái)指定或定位要操作的數(shù)據(jù)的工具,只是用來(lái)讀寫(xiě)RAM里內(nèi)存單元的工作指針?。若對(duì)指針不加任何限定,程序中一個(gè)指針可以指向RAM中的任意位置(除了系統(tǒng)敏感區(qū),如操作系統(tǒng)內(nèi)核所在區(qū)域)并對(duì)其指向的內(nèi)存單元進(jìn)行讀和寫(xiě)操作(由RAM的可讀可寫(xiě)屬性決定);RAM里內(nèi)存單元的可讀可寫(xiě)屬性不會(huì)因?yàn)閷?duì)工作指針的限定而變化(見(jiàn)下面的第4點(diǎn)),而所有對(duì)指針的各種const限定說(shuō)白了只是對(duì)該指針?的?讀寫(xiě)權(quán)限?(包括讀寫(xiě)位置)進(jìn)行了限定?。

? ?? (1)char *p:p是一個(gè)工作指針,可以用來(lái)對(duì)任意位置?(非系統(tǒng)敏感區(qū)域)進(jìn) 行讀操作和寫(xiě)操作?,一次讀寫(xiě)一個(gè)字節(jié)(char占一個(gè)字節(jié))。
???? (2)const char*p或者char const *p(因?yàn)闆](méi)有const*p運(yùn)算,因此const修飾的還是前面的char):可以對(duì)任意位置(非系統(tǒng)敏感區(qū)域)進(jìn)行“只讀”?操作。(“只讀”是相對(duì)于char *p來(lái)說(shuō)所限定的內(nèi)容)
? ?? (3)char *const p(const 修飾的是p):只能對(duì)“某個(gè)固定的位置”?進(jìn) 行讀寫(xiě)操作,并且在定義p時(shí)就必須初始化(因?yàn)樵诤竺娌荒軋?zhí)行“p=..”的操作,因此就不能在后面初始化,因此只能在定義時(shí)初始化)。(“某個(gè)固定的位 置”是相對(duì)于char *p來(lái)說(shuō)所限定的內(nèi)容)
可以總結(jié)以上3點(diǎn)為:char *p中的指針p通常是”萬(wàn)能”的工作指針?,而(2)和(3)只是在(1)的基礎(chǔ)上加了些特定的限制?,這些限制在程序中并不是必須的,只是為了防止程序員的粗心大意而產(chǎn)生事與愿違的錯(cuò) 誤。
另外,要明白“每塊內(nèi)存空間都可有名字;每塊內(nèi)存空間內(nèi)容皆可變(除非有所限)?”?。比如函數(shù)里定義的char s[]="hello";事實(shí)上在進(jìn)程的棧內(nèi)存里開(kāi)辟了6個(gè)變量共6個(gè)字節(jié)的空間,其中6個(gè)字符變量的名字分別為:s1[0]、s1[1]、 s1[2]、s1[3]、s1[4]、s1[5](內(nèi)容是'/0')

{

???待驗(yàn)證?(見(jiàn)后面問(wèn)題3的分析)?:?還有一個(gè)4字節(jié)的指針變量s?。不過(guò)s是“有所限制”的,屬于char *const類(lèi)型,也就是前面說(shuō)的?? (3)這種情況,s一直指向s[0], ? ?即(*s==s[0]=='h'),可以通過(guò)*s='k'來(lái)改變s所指向的 s[0]的值,但不能執(zhí)行(char *h=“aaa”;s=h;)來(lái)對(duì)s另外賦值。

}

???? (4)上面的(2)和(3)只是對(duì)p進(jìn)行限定,沒(méi)有也不能對(duì)p所指向的空間進(jìn)行限定,對(duì)于"char s[]="hello";const char*p=s;" 雖然不能通過(guò)*(p+i)='x'或者p[i]='x'來(lái)修改數(shù)組元素s[0]~s[4]的值,但可以通過(guò)*(s+i)='x'或者s[i]='x'來(lái)修改原數(shù)組元素的值--RAM里內(nèi)存單元的可讀可寫(xiě)屬性不因?qū)ぷ髦羔樀南薅ǘ淖儯粫?huì)因?qū)ζ浔旧淼南薅ǘ淖?。如const char c=‘A’,c是RAM里一個(gè)內(nèi)存單元(8字節(jié))的名字,該內(nèi)存單元的內(nèi)容只可讀,不可寫(xiě)。

? ?? (5)const char **p或者char const**p :涉及兩個(gè)指針p和 *p。由于const修飾char ,對(duì)指針p沒(méi)有任何限定,對(duì)指針*p進(jìn)行了上面情況(2)的限定。

? ? (6)char *const *p:涉及兩個(gè)指針p和 *p。由于const修飾前面的char*,也就是對(duì)p所指向的內(nèi)容*p進(jìn)行了限定(也屬于前面的情況(2))。而對(duì)*p來(lái)說(shuō),由于不能通過(guò)"*p=..."來(lái)進(jìn)行另外賦值,因此屬于前面的情況(3)的限定。

? ? (7)char **const p : 涉及兩個(gè)指針p和 *p,const修飾p,對(duì)p進(jìn)行上面情況(3)的限定,而對(duì)*p,沒(méi)有任何限定。

四、關(guān)于char **p 、const char **p的類(lèi)型相容性問(wèn)題

????1。問(wèn)題

??????? char *p1;const *p2=p1;//合法

??????? char **p1;const? char**p2=p1;//不合法,會(huì)有警告warning: initialization from incompatible pointer type

??????? char **p1;char const**p2=p1;//不合法,會(huì)有警告warning: initialization from incompatible pointer type

??????? char**p1;char*const*p2=p1;//合法

????2。判斷規(guī)則

??????? 明確const修飾的對(duì)象!對(duì)于指針p1,和p2,若要使得p2=p1成立,則可讀做?:

?????????????“p1是指向X類(lèi)型的指針,p2是指向“帶有const限定”的X類(lèi)型的指針?“。

???? ?? char *p1;const *p2=p1;//合法:p1是指向(char)類(lèi)型的指針,p2是指向“帶有const限定"的(char)類(lèi)型的指針。

??? ??? char **p1;const? char**p2=p1;//不合法:p1是指向(char*)類(lèi)型的指針,p2是指向 ((const char)*)類(lèi)型的指針。

? ? ??? char **p1;char const**p2=p1;//不合法;與上等價(jià)。

???? ?? char**p1;char*const*p2=p1;//合法:? p1是指向(char *)類(lèi)型的指針,p2是指向“帶有const限定"的(char*)類(lèi)型的指針。

五、其他

? ? 1。 含有const的單層或雙層指針的統(tǒng)一讀法:

?????????“p是一個(gè)指針,是一個(gè)[“帶有const限定”的]指向[”帶有const限定”的]X類(lèi)型的指針”。

? ? 2。定義時(shí)const修飾的對(duì)象是確定的,但不能在定義時(shí)加括號(hào),不然就和定義時(shí)用“()”表示的函數(shù)類(lèi)型相混淆了!因此定義時(shí)不能寫(xiě)(char *)const *p或者(const char) **p。

?

?

六、問(wèn)題探討(由于博文后的留言有字符數(shù)目限制,將回復(fù)移到這里)

??問(wèn)題1?(見(jiàn)博文后留言):講解非常好,不過(guò)有個(gè)問(wèn)題想探討下: 例如: const char wang[]={"wang"}; char *p; p=wang; 是錯(cuò)誤的。 所以char *p中的P不能指向常變量。 (1)需要補(bǔ)充糾正。

??回復(fù)?:?你好!謝謝指正!我在ubuntu 10.04(gcc 4.4.3)下做了如下測(cè)試:?
?? //test_const.c
?? #include
?? int main()
?? {
???? const char wang[]={"wang"};
???? char *p;
???? p=wang;
???? p[2]='c';
???? printf("p is %s/n",p);
???? return 0;
? }
編譯?:

?????? gcc -o test_const test_const.c
輸出如下?:
?????? test_const.c: In function ‘main’:
?????? test_const.c:17: warning: assignment discards qualifiers from pointer target type
執(zhí)行:

?????? ./test_const
?????? p is wacg
結(jié)論:?根據(jù)本博文中第四點(diǎn)--相容性問(wèn)題,將const型的wang賦值給p是不合法的。但編譯器對(duì)其的處理只是警告,因此執(zhí)行時(shí)通過(guò)p修改了只讀區(qū)域的數(shù)據(jù)。這應(yīng)該是該編譯器處理不嚴(yán)所致后果,不知你用的什么編譯器?

?

??? 問(wèn)題2??回答?http://www.linuxsir.org/bbs/showthread.php?t=239058?提到的問(wèn)題

?

在c語(yǔ)言里

// test.c
int main() {
?? const char* s1 = "test";
?? char *s2 = s1;
?? s2 = "It's modified!";
?? printf("%s/n",s1);
}
out: It's modified!;
這樣也可以嗎? 照我的理解豈不是const限定符在c語(yǔ)言里只是擺設(shè)一個(gè)?

?

???? 回復(fù):

(1)首先,以上代碼編譯時(shí)會(huì)出錯(cuò)warning: initialization discards qualifiers from pointer target type,

???? 因?yàn)閏har *s2 = s1和問(wèn)題1提到的一樣,不符合相容規(guī)則。


(2)輸出結(jié)果是正確的,代碼分析如下:

??int main() {
?? const char* s1 = "test";??//? 在只讀數(shù)據(jù)區(qū)(objdump -h test后的.rodata區(qū))開(kāi)辟5字節(jié)存儲(chǔ)"test",并用s1指向首字符‘t’。?
?? char *s2 = s1;????????????????//? s2也指向只讀數(shù)據(jù)區(qū)中“test”的首字符't'。?
?? s2 = "It's modified!";??????//?在只讀數(shù)據(jù)區(qū)開(kāi)辟15字節(jié)存儲(chǔ)"It's modified!",并將s2由指向't'轉(zhuǎn)而指向"It's modified!"的首字符'I'。?
?? printf("%s/n",s1);??????????// 從s1所指的‘t’開(kāi)始輸出字符串"test"。?
}


(3)總結(jié):提問(wèn)者的誤區(qū)在于,誤以為s2 = "It's modified!"是對(duì)“test”所在區(qū)域的重新賦值,其實(shí)這里只是將“萬(wàn)能”工作指針s2指向另外一個(gè)新開(kāi)辟的區(qū)域而已。比如若在char *s2 = s1后再執(zhí)行s2[2]='a'則是對(duì)“test”的區(qū)域進(jìn)行了寫(xiě)操作,執(zhí)行時(shí)會(huì)出現(xiàn)段錯(cuò)誤。但這個(gè)段錯(cuò)誤其實(shí)與const沒(méi)有關(guān)系,因?yàn)椤皌est”這塊區(qū)域本身就是只讀的。為了防止理解出錯(cuò),凡事對(duì)于對(duì)指針的賦值(比如?s2 = "It's modified!"?),則將其讀做:將s2指向“?It's modified!?”所在區(qū)域的首字符。


(4)額外收獲:執(zhí)行g(shù)cc -o test test.c后,“test”、“It's modified!”、"%s/n"都被作為字符串常量存儲(chǔ)在二進(jìn)制文件test的只讀區(qū)

??? 域 (.rodata)。事實(shí)上,一個(gè)程序從編譯到運(yùn)行,對(duì)變量空間分配的情況如下:

A。賦值了的全局變量或static變量=>放在可執(zhí)行文件的.data段。

B。未賦值的全局變量或static變量=>放在可執(zhí)行文件的.bss段。

C。代碼中出現(xiàn)的字符串常量或加了const的A=>放在可執(zhí)行文件的.rodata段。

D。一般的局部變量=>在可執(zhí)行文件中不占空間,在該二進(jìn)制文件作為進(jìn)程在內(nèi)存中運(yùn)行時(shí)才為它分配??臻g。

E。代碼中malloc或new出的變量=>在可執(zhí)行文件中不占空間,在該二進(jìn)制文件作為進(jìn)程在內(nèi)存中運(yùn)行時(shí)才為它分配堆空間。

?

?

????問(wèn)題3:(待進(jìn)一步分析)?驗(yàn)證博文中 三(3)提到的是否為s分配空間,初步分析結(jié)果為:不分配!文中的s只是s[0]的地址的代號(hào)而已。

#include
int main() {
??? int a=3;
??? char s1[] = "test";
??? int b=4;
??? char s2[] ="test2";
??? printf("the address of a is %u/n",&a);
??? printf("s1 is %u/n",s1);
??? printf("the address of s1 is %u/n",&s1);
??? printf("the address of b is %u/n",&b);
??? printf("s2 is %u/n",s2);
??? printf("the address of s2 is %u/n",&s2);
?? }

輸出結(jié)果:

the address of a is 3213037836
s1 is 3213037827
the address of s1 is 3213037827
the address of b is 3213037832
s2 is 3213037821
the address of s2 is 3213037821

????由結(jié)果可以看出,編譯器做了些優(yōu)化。

?

?七、其他相關(guān)經(jīng)典文章轉(zhuǎn)載

??王海寧,?華清遠(yuǎn)見(jiàn)嵌入式學(xué)院?講師,對(duì)const關(guān)鍵字的理解

???http://www.embedu.org/Column/Column311.htm

?

???? 目前在進(jìn)行C語(yǔ)言補(bǔ)習(xí)時(shí),發(fā)現(xiàn)很多的同學(xué)對(duì)于const這個(gè)關(guān)鍵字的理解存在很大的誤解?,F(xiàn)在總結(jié)下對(duì)這個(gè)關(guān)鍵字理解上的誤區(qū),希望在以后的編程中,能夠靈活使用const這個(gè)關(guān)鍵字。

1、 const修飾的變量是常量還是變量

???? 對(duì)于這個(gè)問(wèn)題,很多同學(xué)認(rèn)為const修飾的變量是不能改變,結(jié)果就誤認(rèn)為該變量變成了常量。那么對(duì)于const修飾的變量該如何理解那?

下面我們來(lái)看一個(gè)例子:

int main
????????{
????????????????char buf[4];
????????????????const int a = 0;

????????a = 10;
????????}

???? 這個(gè)比較容易理解,編譯器直接報(bào)錯(cuò),原因在于“a = 10;”這句話,對(duì)const修飾的變量,后面進(jìn)行賦值操作。這好像說(shuō)明了const修飾的變量是不能被修改的,那究竟是不是那,那么下面我們把這個(gè)例子修改下:

int main
????????{
????????????????char buf[4];
????????????????const int a = 0;

????????buf[4] = 97;
????????????????printf(“the a is %d/n”,a);
????????}

其中最后一句printf的目的是看下變量a的值是否改變,根據(jù)const的理解,如果const修飾的是變量是不能被修改的話,那么a的值一定不會(huì)改變,肯定還是0。但是在實(shí)際運(yùn)行的結(jié)果中,我們發(fā)現(xiàn)a的值已經(jīng)變?yōu)?7了。這說(shuō)明const修飾的變量a,已經(jīng)被我們程序修改了。

那綜合這兩個(gè)例子,我們來(lái)分析下,對(duì)于第二例子,修改的原因是buf[4]的賦值操作,我們知道buf[4]這個(gè)變量已經(jīng)造成了buf這個(gè)數(shù)組變量的越界訪問(wèn)。buf數(shù)組的成員本身只有0,1,2,3,那么buf[4]訪問(wèn)的是誰(shuí)那,根據(jù)局部變量的地址分配,可以知道buf[4]的地址和int a的地址是一樣,那么buf[4]實(shí)際上就是訪問(wèn)了const int a;那么對(duì)buf[4]的修改,自然也修改了const int a的空間,這也是為什么我們?cè)谧詈蟠蛴的值的時(shí)候看到了97這個(gè)結(jié)果。

那么我們現(xiàn)在可以知道了,const修飾的變量是不具備不允許修改的特性的,那么對(duì)于第一個(gè)例子的現(xiàn)象我們又如何解釋那。

第一個(gè)例子,錯(cuò)誤是在程序編譯的時(shí)候給出的,注意這里,這個(gè)時(shí)候并沒(méi)有生成可執(zhí)行文件,說(shuō)明const修飾的變量可否修改是由編譯器來(lái)幫我們保護(hù)了。而第二個(gè)例子里,變量的修改是在可執(zhí)行程序執(zhí)行的時(shí)候修改的,說(shuō)明a還是一個(gè)變量。

綜上所述,我們可以得出一個(gè)結(jié)論,那就是const修飾的變量,其實(shí)質(zhì)是告訴程序員或編譯器該變量為只讀,如果程序員在程序中顯示的修改一個(gè)只讀變量,編譯器會(huì)毫不留情的給出一個(gè)error。而對(duì)于由于像數(shù)組溢出,隱式修改等程序不規(guī)范書(shū)寫(xiě)造成的運(yùn)行過(guò)程中的修改,編譯器是無(wú)能為力的,也說(shuō)明const修飾的變量仍然是具備變量屬性的。

2、 被const修飾的變量,會(huì)被操作系統(tǒng)保護(hù),防止修改

????? 如果對(duì)于第一個(gè)問(wèn)題,有了理解的話,那么這個(gè)問(wèn)題,就非常容易知道答案了。Const修飾的變量是不會(huì)被操作系統(tǒng)保護(hù)的。

其原因是操作系統(tǒng)只保護(hù)常量,而不會(huì)保護(hù)變量的讀寫(xiě)。那么什么是常量?比如“hello world”這個(gè)字符串就是被稱(chēng)為字符串常量。

對(duì)于這個(gè)問(wèn)題的另一種證明方法,可以看下面這個(gè)程序:

int main ()
????????{
????????????????const int a;
????????????????char *buf = "hello world";

????????printf("the &a is %p, the buf is %p/n",&a, buf);
????????}

可以發(fā)現(xiàn)buf保存的地址是在0x08048000這個(gè)地址附近的,而a的地址是在0xbf000000這個(gè)地址附近的,而0x08048000附近的地址在我們linux操作系統(tǒng)上是代碼段。這也說(shuō)明了常量和變量是存放在不同區(qū)域的,自然操作系統(tǒng)是會(huì)保護(hù)常量的。

如果我們知道這個(gè)道理后,再看下面的題目:

#include
int main()
{
?char *buf = "hello";
?buf[0] = 'a';
?printf("the buf is %s/n",buf);
}

我們可以思考下,這個(gè)程序的運(yùn)行結(jié)果會(huì)是什么呢?


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉