2015-08-23 54 views
-5

輸出如何出現JACK?以下需要說明的C指針輸出

#include <stdio.h> 

int main() 
{ 
    void *vp; 
    char ch = 74, *cp = "JACK"; 
    int j = 65; 
    vp = &ch; 
    printf("%c", *(char*)vp); 
    vp = &j; 
    printf("%c", *(int*)vp); 
    vp = cp; 
    printf("%s", (char*)vp + 2); 
    return 0; 
} 
+0

請注意,這隻適用於小端架構,所以不推薦打印字符。 – stark

+0

是的,我正在掙扎,並失敗,看到未來SO訪客的任何價值。 –

+0

我投票結束這個問題,因爲在分析未定義的行爲時沒有用處。 – Olaf

回答

1
vp = &ch; 
printf("%c", *(char*)vp); 

輸出與代碼74(J)字符

vp = &j; 
printf("%c", *(int*)vp); 

輸出與代碼65(A)的字符

vp = cp; 
printf("%s", (char*)vp + 2); 

輸出字符串 「JACK」 具有偏移2(CK)

=> JACK

1

printf("%c", *(char*)vp);vp指向其是用於'J'

printf("%c", *(int*)vp);vp指向包含65的int的地址ASCII一個char含74的地址是用於'A'

printf("%s", (char*)vp + 2);vp"Jack" ASCII。當由2前進時,它打印"CK"

+0

謝謝@CoolGuy –

1

這裏:

char ch=74 

74是字符'J'的十進制值,因此,是相同的

char ch='J' 

這裏:

int j=65; 

65是字符'A'的十進制值,所以是第e與

int j='A'; 

所有這些都可以在the ASCII table中看到。

所以,

printf("%c", *(char*)vp); 

打印Jvp,在這一點上,指出的ch,其保持值74('J'),並將其投射到一個char*和解除引用它給出74上的地址('J') 。

同樣,

printf("%c", *(int*)vp); 

打印Avp,在這一點上,指出的j保持該值65('A'),並將其轉換成一int*和解除引用它給出65的地址('A') 。

最後,

printf("%s", (char*)vp + 2); 

相同

printf("%s", cp + 2); 

因爲vp點的cp第一元件的地址。以上printf的意思是「打印從串的第三個字符開始的所有內容,直到NUL-終止符」並且這打印CK