将int变量作为数组地址使用时编译报错:invalid type argument of unary ‘*’
为什么
*(RF + R2) = 100;会触发"invalid type argument of unary ‘*’ (have ‘int’)"编译错误? 先看你写的代码:
int RF = 0x15; // 数组地址 int R2 = 0 ; // 索引 *(RF + R2) = 100;
这个错误的核心原因很直接:C语言的一元*(解引用)运算符只能作用于指针类型的表达式,而你这里的RF + R2是int类型的数值,不是指针。
你把RF声明成了int类型,哪怕你注释里写了它是数组地址,编译器只会认变量的实际类型。当你计算RF + R2时,得到的是0x15 + 0 = 0x15,这是一个普通的整数,不是指向内存地址的指针。你试图对一个整数用*解引用,完全不符合C语言的语法规则,所以编译器直接报错。
正确的写法
如果你确实想把0x15当作一块内存的起始地址,需要把RF声明为指针类型,并且做强制类型转换(因为0x15是整数常量,不是指针):
// 把0x15强制转换成int类型的指针,赋值给RF int *RF = (int *)0x15; int R2 = 0; // 现在RF是指针,RF+R2是指针加法,解引用合法 *(RF + R2) = 100; // 或者更直观的数组写法,和上面等价 RF[R2] = 100;
重要提醒
直接硬编码内存地址(比如0x15)在绝大多数通用操作系统(Windows、Linux、macOS等)里是非常危险的行为——这个地址大概率不属于你的程序可访问的内存空间,强行写入会直接导致程序崩溃,甚至触发系统保护机制。这种写法通常只在嵌入式系统、硬件驱动等有明确内存映射的场景下才会用到,普通应用程序里几乎不会这么做。
内容的提问来源于stack exchange,提问作者zwerg4
相关产品推荐
相关产品推荐

