register
我对C 中的关键字有疑问。
我发现register
数组名称(例如array
)可以分配给指针变量,而&array[0]
不能。
你能解释一下为什么数组名可以分配给指针吗?或者,如果有人已经解释过,请让我知道链接,以便我查看答案。谢谢你。
这是我尝试过的:
我读了解释关键字的cppreference ,它说:register
寄存器数组不能转换为指针。
另外,我阅读了 C89 草案,其中说:
实现可以将任何寄存器声明简单地视为自动声明。但是,无论是否实际使用可寻址存储,使用存储类说明符寄存器声明的对象的任何部分的地址都可能不会被计算,无论是显式(通过使用 3.3.3.2 中讨论的一元 & 运算符)还是隐式(通过将数组名称转换为指针,如 3.2.2.1 中所述)。因此,唯一可以应用于使用存储类说明符寄存器声明的数组的运算符是 sizeof。
看起来我无法将寄存器数组名称分配给指针以获取其地址。
此外,为了找到答案,我在这里搜索并找到了这个问题: 寄存器变量地址。有很好的答案,但是,我仍然找不到我想要的答案。
这是我测试的代码。我通过带有标志的Clang编译了这段代码-std=c89
:
register int array[10];
int* p;
p = array; // Compiled without warning or error
p = &array[0]; // Compiled with error which I expected
我预计两者p = array;
并p = &array[0];
导致编译错误,但仅p = &array[0];
产生编译错误。