在C++中初始化指针

14

在声明时可以将指针赋值给一个变量吗?像这样:

    int * p = &(1000)

4
你是想将它设置为绝对地址,例如在嵌入式系统中吗?这对答案有很大的影响。 - Mark Ransom
1
确实,很难猜测你在寻找什么......我猜你是指针方面的新手,对口头术语感到困惑,好吧......每个人都要从某个地方开始。 :-) - Tamara Wijsman
4个回答

32

是的,你可以在声明时将指针初始化为一个值,但你不能这样做:

int *p = &(1000);

&是地址运算符,你不能将其应用于常量(尽管如果可以的话,那将会很有趣)。请尝试使用另一个变量:

int foo = 1000;
int *p = &foo;

或类型转换:

int *p = (int *)(1000); // or reinterpret_cast<>/static_cast<>/etc

3
字符串常量是一种特殊情况吗?虽然这需要使用“const char *”… - dmckee --- ex-moderator kitten
3
字符串字面量是特殊的lvalue表达式,指向一个数组对象(而不是指针)。因此,你可以这样做:'char const(p)[3] = &"01";' 更有趣的是,可以这样初始化一个char const:'char const *p = &"hello there"[0];' - Johannes Schaub - litb
它不起作用,我尝试过了,但它显示一些垃圾类型的值。**int *p=(int *)100;。然后输出结果是类似于000003E8**的东西。 - Ravi
1
0x000003E8 等于十进制的 1000。如果你打印 'p',你会看到它是指向的地址。请了解指针。 - Adam Markowitz
关于这个问题:我最近正在学习一些内核空间知识,并找到了一些将指针初始化为地址(指向视频 RAM)的代码。您有任何想法吗? - Jack
关于其他类型的强制转换,我已经测试了static_castdynamic_castconst_castreinterpret_cast,对于单行初始化示例int *p = X_cast<int*>(1000);,只有C风格强制转换和函数风格强制转换(使用(type)objecttype(object),可以替换其他类型的强制转换)和reinterpret_cast有效。有任何想法可能是什么原因吗?为什么我们不能在这里执行static_cast - CreativiTimothy

13

这怎么样:

// Creates a pointer p to an integer initialized with value 1000.
int * p = new int(1000); 

已测试并且可行。;-)


9
但是不要忘记删除! - GManNickG
@GManNickG 这个(new)与上述方法有什么不同之处? - AjB

7

对我来说,问题中有两件事不清楚。你想将指针设置为特定值(即地址),还是想让指针指向某个特定变量?

在后一种情况下,您可以使用取地址运算符。然后指针的将被设置为some_int_variable地址

int *p = &some_int_variable;
*p = 10; // same as some_int_variable = 10;

注意:接下来是手动更改指针值的邪恶操作。如果你不确定是否要这样做,那么你不想这样做。
在前一种情况下(即设置为某个特定的给定地址),你不能仅仅这样做。
int *p = 1000;

由于编译器不会将int解释为地址,因此您必须明确告诉编译器它应该这样做:

int *p = reinterpret_cast<int*>(1000);

现在,指针将引用地址为1000的某个整数(希望如此)。请注意,结果是实现定义的。但尽管如此,这就是语义,也是告诉编译器的方式。
更新:委员会修复了reinterpret_cast(0)的奇怪行为,该行为是由一个注释建议的,我之前提供了一个解决方法。在这里查看

3

嗯,我认为你不能像那样对一个常量取非const地址。

但这样可以:

int x = 3;
int *px = &x;
cout << *px; // prints 3

或者这样:
const int x = 3;
const int *px = &x;
const int *pfoo = reinterpret_cast<const int*>(47);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接