C 中的数组类型转换

Array type casting in C

我有一个如下所示的程序,我正在学习 C 中的类型转换。这里我试图将 void* 转换为 int*。但是编译器抛出错误“error: operand of type 'void' where arithmetic or pointer type is required - printf("%d\n",(int *)(a[2]));

感谢您帮助进行此类型转换。

#include <stdio.h>

void printArray(void* a){
        printf("%d\n",(int *)(a[2]));

}

int main(){
        int a[] = {1,2,3,4};
        printArray(a);
        return 0;
}

a[2] 等同于 *(a + 2)。 a 是一个 void *,所以你取消引用了一个非法的 void *

您应该将 a 转换为 int * 然后取消引用它,如下所示:

*((int *)a + 2)

在带下标运算符的表达式中

a[2]

这里用到了指针运算。此表达式的计算方式类似于

*( a + 2 )

反过来这个表达式 a + 2 实际上被计算为

( char * )a + 2 * sizeof( *a )

但是类型void是一个不完整的类型,即它的大小是未知的。所以编译器不知道表达式 sizeof( *a ) 的值是什么,其中 *a 的类型是 void。结果它发出一条错误消息。

你需要写的是首先将void *类型的指针a转换为int *

类型

所以 printf 的调用可以像

printf("%d\n", ( ( int * )a )[2] );

printf("%d\n", *( (int *)a + 2) );