1. 程式人生 > >C語言指標整理

C語言指標整理

1、記憶體地址

記憶體是按照位元組編址的,所以它的定址單位是位元組(Byte),而一個位元組又有是由8位(bit)的0或1組成。

如果一臺計算機的記憶體是4GB,也就是說它的記憶體總位元組數有2^{32}個,所以要想表示這臺計算機的記憶體地址,就要用到32位(bit)。類似於這樣的32位來表示一個記憶體地址:0110 1101 1100 0010 1101 1110 0101 1101,由於寫起來不方便,所以我們將上述地址用其十六進位制表示:0x6DC2DE5D。

所以這樣的話4GB記憶體的定址空間就從0x00000000到0xFFFFFFFF,總共有2^{32}個。

2、指標變數

明白記憶體地址後,指標實際上就是記憶體地址,指標變數則是儲存指標的變數,也即是儲存了記憶體地址

。下面對指標變數從下面幾個方面進行分析。

指標變數的型別

定義一個int* p為例,這個指標變數的型別就是int *。

指標變數所指向的資料型別

p變數所指向的型別是int資料型別,編譯器通過指標所指向的這片記憶體區域作來決定這片記憶體區域存放什麼資料型別,因為int型別是4個位元組的大小,所以從p指標變數指向的記憶體地址到後四位元組這片記憶體區域就存放了一個int的資料型別。

借這個例子就可以很好理解c語言中malloc函數了。malloc函式作用是分配指定大小的連續記憶體空間,並返回這個記憶體空間的首地址,而這個地址指向的資料型別不明確,所以通常還需要對它進行強制轉換,這樣就得到了一個指向int型別資料的記憶體首地址。

void test(){
    int* p = (int*)malloc(sizeof(int));
    printf("%d", p);
}

 指標變數的大小

通過上面的分析,指標變數的值就是它指向的記憶體地址,是一個數值型別,無論它指向什麼資料型別,這個數值型別都是佔據了4個位元組,也就是說指標變數本身就佔據了4個位元組。

int main()
{
    int* p;
    printf("%d",sizeof(p));    // 輸出4,p變數的大小是4位元組
    return 0;
}

3、地址運算子

*運算子稱作指標運算子或者間接引用運算子,它的作用就是取一個指標變數所指向的記憶體區域所儲存的資料值。

&運算子稱作取地址符,它的作用就是取一個變數所在的記憶體地址。

void test(){
    int a = 10;
    printf("%x", &a);  //60fefc
    int b = *(&a);
    printf("%d", b);   //10
}

地址運算子應用時,通常結合指標變數。

void test(){
    int a = 10;
    int* p = &a;
    printf("%d", *p);   //10
}

Ref: