C語言指標型別和型別轉換

2021-10-20 01:19:40 字數 1488 閱讀 8163

指標是強型別,意思是特定型別的指標變數存放特定型別變數的位址,比如int * 需要乙個指向整形的指標來存放整形資料的位址,char* 需要乙個指向字元型的指標來存放字元型資料的位址,那為什麼說指標是個強型別呢?指標不僅用來表示變數的位址,同時也得使用指標來解引用位址的內容,以此方便修改和使用變數的值。說到這裡,我們又得來回顧一下資料型別所佔空間的大小(32位機器)

int

-4byte

char

-1byte

float

-4byte

我們用乙個例項來說明指標是強型別這個特性,我們知道記憶體是連續的,我們定義乙個變數

int a =

1025

;

這個變數用二進位制表示為0x10000000001,在記憶體中的示意可表示如下

位元組byte3

byte2

byte1

byte0

二進位制值

00000000

00000000

00000100

00000001

假設位址

0x203

0x202

0x201

0x200

整形變數的最高位是符號位,也就是正負符號位

我們這時去用**來看一下整形指標、字元型指標的區別

#include

intmain()

上面的**我們知道列印出來的值是a的位址和1025這個值

我們再定義乙個字元型指標的變數,再來列印變數的值,將上面的**修改為

#include

intmain()

列印出來的內容我們看一下

從上面的列印結果來看,p和p0的位址是一樣的,那麼為什麼列印的值卻是不同的呢?這裡就是資料型別的問題,我們再回到上面的表中,1025 = 0b00000000 00000000 00000100 00000001,整形是以4個位元組大小儲存的,字元型是以1個位元組大小儲存的,字元型指標表示整形指標時會將高3位的資料丟失,只留下最低位的位元組資料,也就是00000001,所以這裡列印出來的值是1。

為了進一步理解這個指標型別,我們看一下p0+1和*(p0+1)的值是多少,**如下

從列印結果來看,p0+1的位址增大乙個位元組,解引用的值為4,這裡的4也就是00000100,上面是強制將p的位址存入p0,它倆的資料型別不同,所儲存的內容也有所不同(僅有乙個位元組資料存入)。提醒我們在使用指標變數時要時刻考慮資料型別,以及是否適合做型別轉換。

C語言指標強制型別轉換

一 舉例說明 上圖對應函式呼叫為int printf const char fmt,fmt為char 指標型別,所以共佔了32位位元組,但是 fmt執行的是乙個位元組,fmt 執行的是下乙個位元組,fmt得到乙個32位位址,char fmt得到是乙個執行位元組的指標,char fmt 4後正好執行了...

C語言指標強制型別轉換

概要 c語言中,任何乙個變數都必須占有乙個位址,而這個位址空間內的0 1 就是這個變數的值。不同的資料型別占有的空間大小不一,但是他們都必須有個位址,而這個位址就是硬體訪問的依據,而名字只是提供給程式設計師的一種記住這個位址的方便一點的方法。但是,不同的變數在機器中都是0 1 所以,我們不能簡單的通...

C語言指標強制型別轉換

概要 c語言中,任何乙個變數都必須占有乙個位址,而這個位址空間內的0 1 就是這個變數的值。不同的資料型別占有的空間大小不一,但是他們都必須有個位址,而這個位址就是硬體訪問的依據,而名字只是提供給程式設計師的一種記住這個位址的方便一點的方法。但是,不同的變數在機器中都是0 1 所以,我們不能簡單的通...