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) );
我有一个如下所示的程序,我正在学习 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) );