2010-07-02 104 views
2
#include<stdio.h> 
main() 
{ 
    int a[]={0,2,4,6,8}; 
    int *ptr; 
    ptr=a; 
    printf("%d", *((char*)ptr+4)); 
} 

*((char*)ptr+4))這是什麼目的?什麼是*((char *)ptr + 4))?

+1

除非您正在使用,否則請勿使用所有附件。 – Amarghosh 2010-07-02 05:11:38

+0

請注意,此代碼的行爲未按C標準定義,請勿將其用於生產代碼。特別是,結果取決於機器的字節順序。 – starblue 2010-07-02 05:54:45

+0

它也取決於'sizeof(int)'。 – dan04 2010-07-02 06:03:14

回答

3

它鑄造的指針被看作是一個字符指針,再加入4看的東西4個字符後來在內存中,並最終取消引用的結果。在int佔用4個字節的典型情況下,它將查看數組中第二個int的第一個字節。 char將被提升爲int,傳遞到printf,並打印出來。

2

ptr最初指向數組的第一個值。 (char*)ptr將其從int*轉換爲char*。在此char*值中加上4將使其增加4 * sizeof(char),使其指向數組的第二個整數,假設32位(4字節)int和小字節平臺上的一個字節字符。外部的*對其進行解引用,因此對輸出2進行解引用。

如果你不是將其轉換爲char* - 作爲*(ptr+4) - 它會增加4 * sizeof(int)指針,因此你已經得到了8,(a[4])作爲輸出。


更新:有一些樂趣!

#include<stdio.h> 
main() 
{ 
    int a[]={0x00010203, 0x04050607}; 
    int *ptr; 
    int i, j; 
    ptr=a; 
    for(i = 0; i < 2; i++) { 
     for(j = 0; j < 4; j++) 
      printf("%d", *((char*)ptr + 4 * i + j)); 
     printf("\n"); 
    } 
} 

我得到的輸出:

3210 
7654 

如果你試試這個大端機器上,你會得到


4567 

因爲PTR瞭解更多關於endianness

+1

答案只會在小端32位平臺上2。在一個big-endian平臺上,你會得到0. – 2010-07-02 05:36:34

+0

@Jason謝謝;更新! – Amarghosh 2010-07-02 05:57:11

0

指向一個地址,它

* ptr是a的第一個值,或者是0.

通過將ptr轉換爲char *並添加4,代碼是說:「獲取ptr存儲的地址,向其中添加4,然後打印值在這個位置。

在這個例子中,它應該打印2

相關問題