2012-12-02 21 views
0

如何從void*投退?如何退回到多維?

int *a[13][12]; 
void *b 
int *c[13][12]; 

b = (void*) a; 
c = (?????) b; 

c = (int *[13][12])b; 

說:cast specifies array type

c = (int *[][])b; 

說:array type has incomplete element type

Compiler是gcc (Ubuntu/Linaro 4.6.1)

+0

'INT ***'也許? – cegfault

+0

c是一個不是指針的數組。如果你聲明c爲int *** c,那麼正常的強制轉換就可以工作。 – Arjor

+0

@cegfault:給出錯誤:「數組類型」int * [13] [12]'不可分配' – Douglas

回答

2

在C中,你不能assign to an array,所以這是由於C聲明爲指針的數組的數組到整型,你不能直接指定。例如,您可以通過在for循環內輪流分配c [i] [j]來覆蓋其所有項目。

+0

'c'不是一個數組,'c'是一個指向2d數組的指針。雖然我希望它是如此。錯了嗎? – Dims

+2

@Dims:'c'是一個二維指針數組,不是指向二維數組的指針。 – netcoder

+0

不,它不是。 c是一個int指針的二維數組。 – Arjor

0

不能直接賦值給數組,也不能賦值給C中的數組類型。但是,由於數組衰減爲指針,因此可以將指針(即:memcpy)中的數據複製到數組中,並將其用作一個數組,如:

#include <stdio.h> 
#include <string.h> 

int main() { 
    int a1=1, a2=2, a3=3, a4=4; 

    int *a[2][2] = { { &a1, &a2 }, { &a3, &a4 } }; 
    printf("%d %d %d %d\n", *a[0][0], *a[0][1], *a[1][0], *a[1][1]); 

    void *b; 
    b = (void*) a; 

    int *c[2][2]; 
    memcpy(c, b, sizeof(c)); 
    printf("%d %d %d %d\n", *c[0][0], *c[0][1], *c[1][0], *c[1][1]); 

    return 0; 
} 

編譯和運行下面的程序會給你:

1 2 3 4 
1 2 3 4 

然而,ca是兩個不同的陣列了。

1

c和a是數組不是指針,見上文,可以使用一個指針指向一個(2暗淡)陣列等

int a[13][12] ={ 1,2,3 }; 
void *b = &a; 
int (*c)[13][12] = b; 

和所有無管型