#define N 100
&N
不可能。我怎么知道N的地址?它必须有一些地址。
答案 0 :(得分:5)
答案 1 :(得分:3)
宏没有任何地址,这就是为什么它们被称为常量值。
答案 2 :(得分:3)
宏是简单的文本替换。如果您编写像
这样的代码int* ptr = &N;
然后将其预处理为
int* ptr = &100;
100
是整数文字,所有整数文字都是常量右值,这意味着你不能为它赋值,也不能取其地址。
文字100
当然存储在内存中 - 您无法在空中分配数字 - 但它很可能会存储为已执行程序代码的一部分。在二进制文件中,您将有一些机器代码指令看起来像"将100存储在指针变量的内存位置"并且100
存储在该机器代码指令中。并且机器代码指令的一部分是不可寻址的。
答案 3 :(得分:2)
这是简单的文本替换。编译器的预处理器用N
替换所有出现的100
,但这取决于N
是什么。在你的例子中,取一个常量的地址不会编译,但这两个其他的例子做。
#include <stdio.h>
#define N 100
#define M x
#define L "Hallo world!"
int main()
{
int x = 42;
//printf ("Address of 'N' is %p\n", (void*)&N); // error C2101: '&' on constant
printf ("Address of 'M' is %p\n", (void*)&M);
printf ("Address of 'L' is %p\n", (void*)&L);
return 0;
}
节目输出:
Address of 'M' is 0018FF3C
Address of 'L' is 0040C018
更多解释。
使用#define N 100
,您无法获得N
的地址,因为像这样的数字常量没有单个内存位置。可能会将100
分配给变量的值,或者优化编译器可能会将100
直接加载到处理器寄存器中。
如果#define M x
是一个简单的替换,那么M
可以完全用作x
。 &x
和&M
之间没有功能差异,因为在预处理器进行替换后,这两个语句是相同的。
在#define L "Hallo world!"
的情况下,我们有一个字符串文字,编译器 放在内存中。询问&L
与询问&"Hallo world!"
是一样的,这就是你得到的。
答案 4 :(得分:1)
N
不是变量,从不有任何地址。当您使用int val=N;
等模式时,这只是一个值粘贴的值。然后,您可以使用val
获取&
的地址。