1. 程式人生 > >指標的定義和使用

指標的定義和使用

1.指標是變數,但是指標的位元組長度是固定的。因為指標儲存的是地址,由作業系統的位數決定,32位機的位元組是4,64位機的位元組是8。

2.指標指向的記憶體空間對應的記憶體空間

我在這裡定義了一個整型指標p儲存num的地址(0x1000),num的地址就是首位元組的地址,而指標p本身的地址為0x2000。下面我們來引入指標的定義:

num對應的記憶體空間為5,指標p對應的記憶體空間為0x1000,指標指向的記憶體空間為5。

num++:對num對應的記憶體空間加1。    5 --> 6

p++:對p對應的記憶體空間加1。(步長)  0x1000  -->  0x1004

(*p)++:對p指向的記憶體空間加1。其中*p是根據p對應的記憶體空間找到其對應的記憶體空間。 5 --> 6

等式:

    p == &num

   *p == num  == *(&num)

下面我們再舉一個例子來進一步說明,如下圖所示


在這裡定義了一個二級指標pp儲存指標p的地址(0x2000),而指標pp本身的地址為0x3000。

pp對應的記憶體空間為0x3000,pp指向的記憶體空間為0x2000。

等式:

    num == *p == **pp == *(&num)

    p == &pp

3.指標的運算

a.指標 +/- 整數 = 指標所對應的記憶體空間與它所指向的型別乘以整數相加減。eg. p++  --> p = p + 1

b.指標 - 指標 = 兩個指標相差的資料個數。

c.指標的比較:如果兩個指標變數指向同一個陣列的元素,那麼指向前面元素的指標變數小於指向後面元素的指標變數。

d.指標加指標沒有實際意義。

4.萬能指標(void *)

void * 可以表示任意一種型別的指標。我們知道相同指標型別之間才能進行賦值,下面我將舉出一個例子來進行說明

    #include <stdio.h>
     
    int main()
    {
        char *ptr = "hello world";
     
        int *tmp = ptr;
     
        printf("%s\n", tmp);
     
        return 0;
    }

    main.c: 在函式 ‘main’ 中:
    main.c:15: 警告:從不相容的指標型別初始化

我們可以看到不同指標型別之間會出現不相容。使用void * 的時候不會出現警告,但是void * 只能接收,不能取值,一旦取值就會出現段錯誤。

5.指標的使用

當我們給指標賦值的時候,我們要注意指標是否分配了合理的記憶體。如果指標的地址為空,那麼就要在堆上用malloc給它分配空間,這樣可以避免野指標的出現!