在看書時無意看見一段程式碼如下:

1
2
  char *cmd;
  asprintf(&cmd, strings %s, in); // in 是一個字元陣列指標

 

忽然覺得疑問,&cmd的輸出值是什麼? 猜想了一下決定寫程式來印證一下自己的想法:&cmd其實是存放cmd char pointer 的address.

 

  這看起來像是廢話,不過我只是好奇指標本身就存放一個address value,那指標的address跟該指標本身存放的address value是不是不一樣?答案當然不一樣,但我只是想進一步釐清一下三者的關係:

  1. 指標位址(Pointer Address): 就是存放指標變數的記憶體空間之位址。
  2. 指標內容(Pointer Value) : 就是指標本身的內容,應該是一個address值,其指向某實體數值。
  3. 指標指向內容(Pointer points Value): 指標指向的位置空間所存放的內容。

 

   所以前兩者應該都是Address Value,只有最後是真實的Value,為了印證這想法,我寫了以下程式來驗證:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
        char *cmd="def";

        printf("cmd pointer address : %p\n", &cmd);
        printf("cmd pointer value : %p\n",cmd);
        printf("cmd pointer point to a content: %s\n", cmd);

        //char const *in = "abc";
        //asprintf(&cmd," %s", in);
        //free(cmd);
}

 

  然後存成檔案 ptr_and.c 之後用 gcc的c99標準編譯程式並得到如下執行結果:

  可以看到pointer address( &cmd)印出的是指標在記憶體中的位置0xffffcbf8,而pointer value(cmd)也是印出記憶體位置0x100403000,但這是pointer 所內含的數值,其指向的是位於0x100403000空間的”def”字串。

二○一八年七月十九日星期四

arrow
arrow

    jackterrylau 發表在 痞客邦 留言(0) 人氣()