c - C 中的数组类型转换

标签 c implicit-conversion void-pointers pointer-arithmetic

我有一个如下所示的程序,我正在学习 C 中的类型转换。这里我尝试将 void* 转换为 int*。但编译器抛出一个错误,指出“错误:需要算术或指针类型的操作数类型为'void' - 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 + 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) );

关于c - C 中的数组类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67251564/

相关文章:

json - Playframeworks json Writes implicit 需要显式类型,为什么?

c - 如何将大量变量发送到泛型函数?

mysql - 将时间戳转换为 MYSQL_TIME

c - 不带字符串逐个字母地阅读文本

c - 如何保护注册表不使用 deleteservice?

c - 在双链表上查找带有 void * 的函数

c - 复制到void *指针

c - nm 实用程序输出中符号大小的输出格式是什么

C# 协方差 : classes with different interface signature

c# - IsAssignableFrom 的隐式版本?