2015-11-17 27 views
3

我在C中學習指針,但我對這個例子有點困惑。以下三個printf()陳述中指針的指針邏輯是什麼?這些是什麼:*(char*)ptr*(int*)ptr,(char*)ptr+2,到底在幹什麼?瞭解printf語句中的指針後勤問題

#include<stdio.h> 
int main() 
{ 
    void *ptr; 
    char ch=74, *cp="CS107"; 
    int j=65; 
    ptr=&ch; 
    printf("%c\n", *(char*)ptr); 
    ptr=&j; 
    printf("%c\n", *(int*)ptr); 
    ptr=cp; 
    printf("%s\n", (char*)ptr+2); 
    return 0; 
} 

回答

1

指出我相信你已經有了答案,只是要澄清隱藏點元素的指針,讓我補充一些更多的信息到已經存在的答案。

  • printf("%c\n", *(char*)ptr);

    鑄void指針ptrchar指針,則去參考打印char值。

  • printf("%c\n", *(int*)ptr);

    鑄void指針ptrint指針,則解除參照打印int值的char表示。

  • printf("%s\n", (char*)ptr+2);

    這裏,operator precedence進場。由於演員操作符優先於二進制加法,因此ptr將首先被轉換爲char *,然後,指針算術將生效,將指針遞增指向第三個元素(基於0的索引,請記住?)。

1

(char*)ptr被稱爲鑄造。一種類型的指針(ptr)被投射爲指向另一種類型的變量(char*)。


在你的榜樣,ptrvoid類型的指針,它被用來在不同的地方,以指向不同類型的變量。

ptr=&ch;這使得它指向char類型的變量。

但是,指針ptr本身只是void型的,所以後來在printf()聲明,它必須被明確地鑄造鍵入char*,使其工作。

printf("%c\n", *(char*)ptr); 
       ^^^^^^^ 

然後,取消訪問駐留在該內存中的元素。

printf("%c\n", *(char*)ptr); 
      ^

同去的其他類型的如下。

1
  • *(char*)ptr:治療的ptr值作爲指向char數據的指針,然後讀取由ptr
  • *(int*)ptr指向的char數據:治療的ptr值作爲指向int數據的指針,則讀取由ptr
  • (char*)ptr+2指向的int數據:當作該指向char數據的指針的ptr值,然後計算指着char數據是提前2個元素由ptr