- N +

c語言指針強(qiáng)制類型轉(zhuǎn)換,地址強(qiáng)轉(zhuǎn)為unsigned指針

大家好,關(guān)于c語言指針強(qiáng)制類型轉(zhuǎn)換很多朋友都還不太明白,今天小編就來為大家分享關(guān)于地址強(qiáng)轉(zhuǎn)為unsigned指針的知識(shí),希望對(duì)各位有所幫助!

指針強(qiáng)制轉(zhuǎn)換有什么作用

因?yàn)椋羔樀膹?qiáng)制轉(zhuǎn)換是指將指針?biāo)傅膬?nèi)容的類型由原先的類型轉(zhuǎn)換為后面的類型。

所以指針強(qiáng)制轉(zhuǎn)換的作用,就是按照某個(gè)變量的類型取出該變量的值,再按照***to***的規(guī)則進(jìn)行強(qiáng)制轉(zhuǎn)轉(zhuǎn)換。如果是(類型名)常數(shù),則是將該常數(shù)按照常數(shù)to類型的規(guī)則進(jìn)行強(qiáng)制轉(zhuǎn)換。

可以將指針強(qiáng)制轉(zhuǎn)換成int型或者其他類型。同樣,也可以將任何一個(gè)常數(shù)轉(zhuǎn)換成int型再賦值給指針。

C語言的指針不是地址嗎為什么地址還要區(qū)分類型指針的加法也好難,該怎么理解呢

謝謝邀請(qǐng)。

題主的疑問應(yīng)該是,C語言的指針變量里存放的是地址,而地址明明是一個(gè)整數(shù),為什么整數(shù)還要區(qū)分類型?至于指針的加法,題主應(yīng)該是注意到了有時(shí)候1+1并不等于2,對(duì)不?其實(shí)這并沒有什么難的,請(qǐng)繼續(xù)往下看。

為何要有不同類型的指針變量

稍稍思考一下,應(yīng)該能夠發(fā)現(xiàn),C語言中的指針是通過修改內(nèi)存來修改變量的值的。

既然指針是通過修改內(nèi)存來修改變量的值的,那么,一個(gè)指針一次修改多少內(nèi)存呢?這就涉及到指針的類型了。請(qǐng)看例子,相關(guān)C語言代碼如下:

對(duì)于數(shù)組i[8],i其實(shí)就表示這個(gè)數(shù)組的首地址,所以可以直接把它賦值給指針變量p1。這樣一來,我們就可以通過p1來修改數(shù)組i了。

指針p1是signedchar*類型的,通過p1修改i所在內(nèi)存時(shí),一次修改sizeof(signedchar)字節(jié),也即1字節(jié)。那么,p1+1指向的就是i的第二個(gè)元素(i[1]),執(zhí)行*(p1+1)=5;以后,i[1]就等于5了。

按照這個(gè)邏輯,p2是int*類型的指針變量,請(qǐng)看上圖,通過p2訪問數(shù)組i時(shí),一次訪問的實(shí)際上是sizeof(int)=4字節(jié)內(nèi)存。所以*(p2+1)=9;實(shí)際上修改的是i的第5~8字節(jié)。

我們把C語言代碼寫完整些,通過p1修改后,把i全部打印出來;通過p2修改后,再把i全部打印出來,請(qǐng)看如下C語言代碼:

編譯并執(zhí)行這段C語言代碼,得到如下輸出:

1534567815349000指針的加法

看到這里,你可能會(huì)有疑問了,i的地址為4000,那p1和p2指向的也是4000,p1+1指向4001地址,這沒什么好說的。但是p2+1指向的卻是4004?4000+1等于4004,這不是扯淡嗎?!

這還真不是扯淡,題主可以看看我之前關(guān)于C語言數(shù)據(jù)類型的問答或者文章,應(yīng)該能夠注意:“+”運(yùn)算符要求兩邊的操作數(shù)是同一類型的,如果不同則會(huì)自動(dòng)轉(zhuǎn)換。

p1和p2是指針類型的,而“+1”的這個(gè)“1”是整型的,因此在做加法之前,會(huì)有自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換的過程。p1是signedchar*型的指針變量,所以“+1”就相當(dāng)于“+1xsizeof(signedchar)”,因此p1+1=4001。類似的,p2加上整型1就相當(dāng)于“+1xsizeof(int)”,因此p2+1=4004。

為了驗(yàn)證我們的分析,下面寫C語言代碼做實(shí)驗(yàn),我們分別定義signedchar*型的指針變量p1和int*型的指針變量p2,均賦值為1,然后分別對(duì)p1和p2加一,打印它們?cè)瓉淼闹担图右缓蟮闹担?qǐng)看如下C語言代碼:

編譯并執(zhí)行這段C語言代碼,得到如下輸出:

p1=0x1,p1+1=0x2p2=0x1,p2+1=0x5

這就驗(yàn)證了我們的分析。類似的,讀者可以自行分析long*、float*、double*等任意類型的指針變量的加法運(yùn)算。

可以將指針的加數(shù)“1”看作有“單位”的,單位大小取決于指針的類型。這樣就好理解“1+1”不等于2的情況了,因?yàn)?千克+1毫克不等于2千克,對(duì)不?

作為延伸,下面再討論一些C語言指針的特性。

指針變量占多少內(nèi)存空間?

既然指針變量存儲(chǔ)的是內(nèi)存地址,那么指針變量的位寬就應(yīng)該保證能夠存儲(chǔ)最大的地址。例如在大多數(shù)32位計(jì)算機(jī)中,指針變量的位寬為4字節(jié),因?yàn)槎鄶?shù)情況下,在32位計(jì)算機(jī)中,最大的內(nèi)存地址為0xffffffff,至少需要4字節(jié)才能完整保存。相應(yīng)的,在大多數(shù)64位計(jì)算機(jī)中,指針變量的位寬為8字節(jié)。

指針這么強(qiáng),能操作任意地址碼?

很多程序員都說,某類型的變量,一定不能用其他類型的指針操作。這句話其實(shí)并不嚴(yán)謹(jǐn),例如上面舉的例子中的char類型數(shù)組i[8],我們完全可以使用int*p2指針把它當(dāng)做兩個(gè)int型變量使用。

只不過一定要小心p2別超過i[8]的范圍了,p2+2指向的就是數(shù)組i后的地址了。這里可能存儲(chǔ)著非常重要的信息,如果使用p2+2把這部分的內(nèi)容修改了,程序出現(xiàn)段錯(cuò)誤退出還好,要是沒有報(bào)錯(cuò),卻給出了錯(cuò)誤結(jié)果就麻煩了,這種錯(cuò)誤非常難發(fā)現(xiàn),所以在開發(fā)階段就應(yīng)該小心處理。

按照上面的分析,在定義局部指針變量時(shí),如果忘了對(duì)它初始化,局部變量的值是任意的,這也就是說它可能指向任意地方,這時(shí)如果使用它,也有可能出現(xiàn)難以發(fā)現(xiàn)的錯(cuò)誤。

這種指向不確定地址的指針,程序員習(xí)慣稱為“野指針”。

為了避免出現(xiàn)野指針,在定義指針變量時(shí)就應(yīng)該給它明確的初值,例如:

就是把地址0轉(zhuǎn)換成指針類型,稱為空指針,它的特殊之處在于,操作系統(tǒng)不會(huì)把任何數(shù)據(jù)保存在地址0及其附近,也不會(huì)把地址0~0xfff的頁面映射到物理內(nèi)存,所以任何對(duì)地址0的訪問都會(huì)立刻導(dǎo)致段錯(cuò)誤。*p=0;會(huì)導(dǎo)致段錯(cuò)誤,就像放在眼前的炸彈一樣很容易找到,相比之下,野指針的錯(cuò)誤就像埋下地雷一樣,更難發(fā)現(xiàn)和排除,這次走過去沒事,下次走過去就有事。

void*指針常常被稱作萬能指針,限于篇幅,以后再討論。

歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言,喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。

c語言中str的用法

答:c語言中str的用法步驟如下:charc[20];strings="1234";strcpy(c,s.c_str());這樣才不會(huì)出錯(cuò),c_str()返回的是一個(gè)臨時(shí)指針,不能對(duì)其進(jìn)行操作。

語法:constchar*c_str();c_str()函數(shù)返回一個(gè)指向正規(guī)C字符串的指針,內(nèi)容與本string串相同.

這是為了與c語言兼容,在c語言中沒有string類型,故必須通過string類對(duì)象的成員函數(shù)c_str()把string對(duì)象轉(zhuǎn)換成c中的字符串樣式。注意:一定要使用strcpy()函數(shù)等來操作方法c_str()返回的指針。

C語言,指針,強(qiáng)制類型轉(zhuǎn)換

(unsignedint*)0x00100把0x00100轉(zhuǎn)化成指針因?yàn)閡nsignedint*是指針類型好比(int)3.1415就是取整數(shù)部分,這里不是轉(zhuǎn)化為變量吧,而是一個(gè)常量3

c語言怎么把整型常量變?yōu)楦↑c(diǎn)

在C語言中,可以使用強(qiáng)制類型轉(zhuǎn)換將整型轉(zhuǎn)換為浮點(diǎn)型。具體方法如下:

```c

intnum=10;

floatfnum=(float)num;

```

在上面的代碼中,使用了強(qiáng)制類型轉(zhuǎn)換將整型變量num轉(zhuǎn)換為浮點(diǎn)型變量fnum。使用括號(hào)將目標(biāo)類型括起來,放在要轉(zhuǎn)換的值的前面即可。需要注意的是,強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致精度損失或溢出問題,因此在進(jìn)行類型轉(zhuǎn)換時(shí)需要小心。

文章到此結(jié)束,如果本次分享的c語言指針強(qiáng)制類型轉(zhuǎn)換和地址強(qiáng)轉(zhuǎn)為unsigned指針的問題解決了您的問題,那么我們由衷的感到高興!

返回列表
上一篇:
下一篇: