我只是想知道是否有可能指向#define常量的指针。如果是的话,该怎么做?
答案 0 :(得分:12)
#define
指令是preprocessor的指令,这意味着在编译任何内容之前,预处理器会调用它。
因此,如果您输入:
#define NUMBER 100
然后你输入:
int x = NUMBER;
您的编译器实际上看到的只是:
int x = 100;
基本上就好像你在文字处理器中打开了你的源代码并进行了查找/替换,将每个“NUMBER”替换为“100”。所以你的编译器不知道NUMBER
的存在。只有预编译预处理器知道NUMBER
的含义。
因此,如果您尝试获取NUMBER
的地址,编译器会认为您正在尝试获取整数文字常量的地址,这是无效的。
答案 1 :(得分:11)
不,因为#define
用于文本替换,所以它不是一个可以获得指针的变量 - 你看到的内容实际上被代码前#define
的定义所取代被传递给编译器,所以没有什么可以取的。如果需要常量的地址,请改为定义const
变量(C ++)。
通常认为使用常量而不是宏是一种好习惯,因为它们实际上代表变量,具有自己的范围规则和数据类型。宏是全局的,无类型的,在大型程序中很容易混淆读者(因为读者看不到实际存在的内容)。
答案 2 :(得分:3)
#define
定义了一个宏。宏只会导致一个令牌序列被不同的令牌序列替换。指针和宏是完全不同的东西。
如果通过“#define
常量”表示扩展为数值的宏,则答案仍然是否定,因为在使用宏的任何地方,它都会被该值替换。例如,没有办法获得指针42
。
答案 3 :(得分:0)
不,这在C / C ++中是不可能的
您可以使用#define指令为程序中的常量提供有意义的名称
我们可以使用两种形式。
请:查看此链接
http://msdn.microsoft.com/en-us/library/teas0593%28VS.80%29.aspx
#define指令可以包含类似对象的定义或类似函数的定义。
我很抱歉,我无法提供更多的眨眼...请参阅IBM链接..因为下面我粘贴了linke链接
你可以从以上2个链接获得完整信息
答案 4 :(得分:0)
有一种方法可以解决这个问题:
#define ROW 2
void foo()
{
int tmpInt = ROW;
int *rowPointer = &tmpInt;
// ...
}
或者如果您知道它的类型,您甚至可以这样做:
void getDefinePointer(int * pointer)
{
*pointer = ROW;
}
并使用它:
int rowPointer = NULL;
getDefinePointer(&rowPointer2);
printf("ROW==%d\n", rowPointer2);
你有一个指向#define常量的指针。