2013-06-05 80 views
4

我有一個返回void指針的函數。假設我知道指向的數據塊是一個int數組。我如何打印它們?虛擬指針的打印值

從另一個線程我看到了,我投的空隙,例如我所需要的數據類型是這樣的:

printf("%i",*((int*)data)); 

但是就像我說的數據是int數組。我試圖做到這一點,但它不是一個有效的表達式:

for(i = 0; i<3; i++){ 
    printf("%i \n", *((int*)(data+sizeof(int)*i))); 
} 

什麼是印刷本的正確方法?

+2

'int * ptr = void_pointer;'然後使用'ptr'。 (您也可以編寫'*((int *)data + i)',但使用'int *'則不太容易出錯。) –

+0

順便說一句,'*((int *)data + i) '是完全有效和正確的(儘管完全不可讀)。 – 2013-06-05 21:48:43

+0

@ H2CO3比'*(int *)((char *)data + i * sizeof(int))'更可讀,不是嗎? ;) –

回答

5

只需使用一個臨時int*

int *p = data; 
for (int i=0; i<3; i++) 
    printf("%i\n", p[i]); 

注意,有一個在第一線沒有明確的演員陣容,因爲這是不需要用void*和避免顯式轉換被認爲是不錯的C風格。在循環內部,我已經使用了一個事實,即可以將它指向數組的指針,就好像它是數組本身一樣。

1

您的原始嘗試在「正式」C中不正確,因爲指針算術不適用於指針void *。不過,有些編譯器支持將指針作爲非標準擴展指針算法(GCC是一個值得注意的例子)。在這樣的編譯器中,void *指針被視爲char *用於算術目的的指針。而你的

for(i = 0; i < 3; i++) 
    printf("%i\n", *((int *) (data + sizeof(int) * i))); 

將實際上按照預期在這樣的編譯器中工作。

有了更迂腐的編譯器,你可以通過做

for(i = 0; i < 3; i++) 
    printf("%i\n", *((int *) ((char *) data + sizeof(int) * i))); 

但在任何情況下保存一天,上面的代碼兩片絕望過於複雜。當你剛剛學習指針算術時,它們有一些價值,但這就是它們所有的優點。

你真正需要的僅僅是

for(i = 0; i < 3; i++) 
    printf("%i\n", ((int *) data)[i]); 

可以引入一個額外的int *指針,如其他答案建議,使你的代碼更易讀。但這取決於你。