2016-03-04 32 views
-4

为什么这段代码使用& (*p)[i]如何使用void *?

typedef void* sir; 
int main(){ 

    sir *p;  
    int x[10],i;  
    for(i = 0;i < 10;i++) 
     x[i] = i; 
    p = &x; 
    for(i = 0;i < 10;i++) 
     printf("%d ",&(*p)[i]); 
    return 0; 
} 
+0

什么是'sir'的定义是什么? – MikeCAT

+2

@MikeCAT'typedef void sir' ...糟糕的格式 –

+2

然后'p'的类型为'void **'。 – MikeCAT

回答

2

你Typedef的sirvoid *,所以当你写sir *p,您声明pvoid**型,双无效pointer.Try,而不是申报psir p,并打印的元素阵列,使用以下:

#include <stdio.h> 
#include <stdlib.h> 

typedef void* sir; 

int main(void) 
{ 
    sir p; 
    int x[10], i; 
    for (i = 0; i < 10; i++) 
     x[i] = i; 
    p = &x; 
    for (i = 0; i < 10; i++) 
     printf("%d ", *((int *)p + i)); 
    return 0; 
} 

注:void指针不能在没有适当的类型,int在这case.Also指针运算铸解引用上不允许空指针。

要打印的数组,而不是内容本身的元素的地址,使用:

for (i = 0; i < 10; i++) { 
    printf("%p\n", (void *)((int *)p + i)); 
} 
+0

不要使用'%x'来打印地址,或者调用*未定义的行为*。使用'%p'并投射地址以打印到'void *'。 – MikeCAT

相关问题