1. 程式人生 > 其它 >C語言指標型別和型別轉換

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

技術標籤:C語言基礎知識筆記c語言指標

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

指標型別

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

int - 4byte
char - 1byte
float - 4byte

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

int a = 1025;

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

位元組byte3byte2byte1byte0
二進位制值00000000000000000000010000000001
假設地址0x2030x2020x2010x200

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

型別轉換

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

#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,它倆的資料型別不同,所儲存的內容也有所不同(僅有一個位元組資料存入)。提醒我們在使用指標變數時要時刻考慮資料型別,以及是否適合做型別轉換。