2018年3月19日 星期一

為什麼 char* str 在 printf 的時候 str 與 *str 會印出一樣的內容

為什麼 char* str 在 printf 的時候 str 與 *str 會印出一樣的內容

    char str[][1] = {{1}};
    printf("%p\n",  str);   // is address
    printf("%p\n",  *str);  // is address
    printf("%d\n", (int)    *(char*)str); // is 1

第一行

返回的就是一個陣列的地址這個應該不是個大問題,只是這中間編譯器自己默默做了一次隱式轉換
str 是一個 char(*)[1] 型態 自動轉換成 (char**)型態 他們之間並不完全等價,前者是陣列後者是指針。
這裡實際輸入函式的型態是 (cahr**)

第二行

這個是因為陣列轉換後的指針正好會是第一個值的關係,所以derefrence之後之後還是同一個地址
這裡實際輸入函式的型態是 (cahr*), 由 (char**) dereferance 而來。

第三行

這裡多一個語法上不安全的型別轉換,從 (char**) 轉換到 (char*)
(這個例子使用上是安全的)。
轉換成指針之後再 derefernnce 獲得記憶體內容,最後再轉成整數印出。
因為放置的內容 1 所以就是 1 了,如果內容是 1 對照一下表會是 49
    char str[][1] = {{1}};
    printf("%p\n",  str);   // is address
    printf("%p\n",  *str);  // is address
    printf("%d\n", (int)    *(char*)str); // is 1

沒有留言:

張貼留言