为何int指针可通过void指针指向char类型数组?
问题解析:int指针为何能通过void指针指向char数组
先看你的代码:
char arr[] = {0,1,2,3}; void *vp; int *ip; vp = arr; ip = vp;
核心原因是void*是C语言里的通用指针类型,它的设计就是用来兼容任意数据类型的指针:
- 第一步
vp = arr;:数组名arr会隐式转换成char*指针,而C标准允许任何非函数指针直接赋值给void*,不需要强制转换。 - 第二步
ip = vp;:C标准同样允许把void*转换回任意非函数指针类型,这里就是转成int*,语法上完全合法(部分编译器可能会弹出警告,但不属于语法错误)。
不过要注意,这种写法存在潜在风险:
- char类型通常占1字节,int类型多数平台占4字节。当你用
ip去解引用(比如*ip)时,会一次性从arr的起始位置读取4个char字节,把它们当作一个int值。这会涉及字节序问题(比如小端平台下*ip的值是0x03020100,大端平台则是0x00010203)。 - 如果char数组的长度不足一个int的字节数,用int指针访问会直接触发数组越界,导致未定义行为。
内容的提问来源于stack exchange,提问作者EduHG
相关产品推荐
相关产品推荐

