為什麼 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 是一個
str 是一個
char(*)[1] 型態
自動轉換成 (char**)型態
他們之間並不完全等價,前者是陣列後者是指針。
這裡實際輸入函式的型態是
(cahr**)
第二行
這個是因為陣列轉換後的指針正好會是第一個值的關係,所以derefrence之後之後還是同一個地址
這裡實際輸入函式的型態是
(cahr*)
, 由 (char**)
dereferance 而來。第三行
這裡多一個語法上不安全的型別轉換,從
(這個例子使用上是安全的)。
轉換成指針之後再 derefernnce 獲得記憶體內容,最後再轉成整數印出。
因為放置的內容 1 所以就是 1 了,如果內容是
(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
沒有留言:
張貼留言