C語言指標型別和型別轉換
C語言指標型別和型別轉換
指標型別
指標是強型別,意思是特定型別的指標變數存放特定型別變數的地址,比如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 <stdio.h>
int main()
{
int a = 1025;
int *p;
p = &a;
printf("size of integer is %d bytes\n",sizeof (int));
printf("Address = %d, value = %d\n",p,*p);
return 0;
}
上面的程式碼我們知道打印出來的值是a的地址和1025這個值
我們再定義一個字元型指標的變數,再來列印變數的值,將上面的程式碼修改為
#include <stdio.h>
int main()
{
int a = 1025;
int *p;
char *p0;
p = &a;
printf("size of integer is %d bytes\n" ,sizeof(int));
printf("Address = %d, value = %d\n",p,*p);
p0 = (char *)p;//這裡要做型別轉換
printf("size of char is %d bytes\n",sizeof(char));
printf("Address = %d, value = %d\n",p0,*p0);
return 0;
}
打印出來的內容我們看一下
從上面的列印結果來看,p和p0的地址是一樣的,那麼為什麼列印的值卻是不同的呢?這裡就是資料型別的問題,我們再回到上面的表中,1025 = 0b00000000 00000000 00000100 00000001,整形是以4個位元組大小儲存的,字元型是以1個位元組大小儲存的,字元型指標表示整形指標時會將高3位的資料丟失,只留下最低位的位元組資料,也就是00000001,所以這裡打印出來的值是1。
為了進一步理解這個指標型別,我們看一下p0+1和*(p0+1)的值是多少,程式碼如下
#include <stdio.h>
int main()
{
int a = 1025;
int *p;
char *p0;
p = &a;
printf("size of integer is %d bytes\n",sizeof(int));
printf("Address = %d, value = %d\n",p,*p);
p0 =(char *) p;
printf("size of char is %d bytes\n",sizeof(char));
printf("Address = %d, Vaule = %d\n",p0,*p0);
printf("Address of p0+1 = %d, Vaule of *(p0+1) = %d\n" ,p0+1,*(p0+1));
return 0;
}
從列印結果來看,p0+1的地址增大一個位元組,解引用的值為4,這裡的4也就是00000100,上面是強制將p的地址存入p0,它倆的資料型別不同,所儲存的內容也有所不同(僅有一個位元組資料存入)。提醒我們在使用指標變數時要時刻考慮資料型別,以及是否適合做型別轉換。