0

我想用一个值(如1000)声明和初始化一个指针,我不想使用第二个变量。请看下面:

int *p = &1000;
Output: error : & on Constant

int *p = (int *)1000;
Output: 0000003E8

int *p = new int(1000);
Output: 1000

因为,前两种方法没有给出预期的输出。所以,我想知道,哪一个是正确的方法,为什么?

参考

4

7 回答 7

2

指针的全部意义(没有双关语)是指向另一个变量(或至少在一些内存中——可以是一块动态分配的内存,如第三个示例中所示,而不是实际变量。

尝试用整数文字初始化它根本没有多大意义。仅在极其有限的情况下,使用转换为指针类型的整数文字对其进行初始化才有意义——它使您能够直接读取/写入该绝对内存地址。这在小型嵌入式系统之类的东西上是有意义的,它可能具有可以在该地址访问的内存映射设备之类的东西。否则,它几乎毫无意义和无用。

作为术语的旁白:您实际上是在定义一个指针,而不仅仅是声明它。声明将类似于:

extern int *p;

这告诉编译器存在一个在其他地方(即在其他翻译单元中)定义的指针。它最常出现在标题中。由于它只是告诉编译器指针,它不能包含声明。

于 2012-11-30T04:41:18.903 回答
1

根据你的评论,

当我尝试 *p 时,它显示 1000。现在,无论你得到什么。

您想初始化指针,使其指向存储整数的位置1000。您不想将指针初始化为指向绝对地址1000

在您提供的三行代码中,只有最后一行可以满足您的要求:

int *p = new int(1000);

这会在堆上为 a 分配空间,并使用对空间进行int值初始化1000

笔记:

  • 在堆上为单个分配空间int有时可能是必要的,但大多数时候它不会有用,因为 anint是一个非常小的对象。指针很可能同样大或更大,因此传递指向 a 的指针int,而不是传递int自身,用途有限。

  • 如果你真的认为你需要这个,请记住,你需要稍后释放该空间,使用

    delete p;
    
  • 一般而言,大多数时候您需要在堆上分配空间并维护指向它的指针,最好使用智能指针(例如C++11 中的std::unique_ptr<int>std::shared_ptr<int>)来避免考虑释放。

于 2012-11-30T05:08:57.843 回答
0

运算符的地址不能应用于参考页面本身中提到的常量。

目前尚不清楚为什么要以这种方式初始化指针。最好将常量分配给另一个变量并在它们上使用运算符的地址

如果指针值将在代码中的某处更改,那么最好用 NULL 初始化指针。

于 2012-11-30T04:38:43.187 回答
0

第一个是错误的(正如在接受的答案和您的编译器中指出的那样)
第二个似乎是正确的,但我不确定您在显示什么。您可能会显示由 p 表示的地址而不是它的值。尝试显示 *p 而不是只显示 p
第三个似乎是正确的,但仅适用于 C++ 而不是 C
编辑:
这就是您实现 Jay 答案的方式

int a = 1000;
int *p;
p=&a;
于 2012-11-30T04:39:06.793 回答
0

整数 * p = 新整数;*p = 1000;

这就是你想要的。第一个字符串为整数分配内存,第二个用 1000 初始化它。不要原谅写“delete p;” 当您在程序中不再需要它时释放与 p 相关的内存。

于 2012-11-30T04:49:52.830 回答
0
#include<stdio.h>

int main()
{
    int *ptr = (int *)1000;

    printf("%d\n", ptr);
    return 0;
}

但这不是为指针赋值的正确方法。

于 2012-11-30T05:10:17.177 回答
0
int *p = &1000;         /*You cannot use & of 1000 As 1000 is the numeric constant not the address of any variable*/

int *p = (int *)1000;   /*You are trying to do casting the value into the pointer so the pointer p will hold the address 0x000003e8 and the address will be pointing to some garbage value*/

int *p = new int(1000); /*In this statement you are trying to allocate the address of some variable form heap and storing a "1000" in that address*/
于 2020-01-30T08:39:47.580 回答