如何声明和分配指针

时间:2012-11-30 04:34:29

标签: c++ c pointers

我想声明并初始化一个带有值的指针(如1000),我不想使用第二个变量。请参阅以下内容:

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

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

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

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

Reference

7 个答案:

答案 0 :(得分:2)

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

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

作为术语的旁白:你实际上是在定义一个指针,而不只是声明它。声明如下:

extern int *p;

这告诉编译器存在一个在其他地方定义的指针(即,在某些其他翻译单元中)。它最常见于标题中。因为它只告诉编译器有关指针的信息,所以它不能包含声明。

答案 1 :(得分:1)

根据你的评论,

  

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

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

在您提供的三行代码中,只有最后一行符合您的要求:

int *p = new int(1000);

这为堆上的int分配空间,并使用1000对该空间进行值初始化。

注意:

  • 有时可能需要在堆上为单个int分配空间,但大部分时间它都没有用,因为int是一个非常小的对象。指针很可能同样大或者更大,因此绕过指向int的指针,而不是绕过int本身,但用途有限。

  • 如果您确实认为自己需要此功能,请记住以后需要使用

    取消分配该空间
    delete p;
    
  • 总的来说,大多数时候你需要在堆上分配空间并保持指向它的指针,你最好使用智能指针(例如std::unique_ptr<int>或{{1}在C ++ 11)中避免不得不考虑释放。

答案 2 :(得分:0)

运算符的地址无法应用于参考页面本身所述的常量。

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

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

答案 3 :(得分:0)

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

int a = 1000;
int *p;
p=&a;

答案 4 :(得分:0)

int * p = new int; * p = 1000;

多数民众赞成你想要的。第一个字符串为整数分配内存,第二个字符串用1000初始化它。 不要原谅写“删除p;”当你在程序中没有任何需要时,释放与p相关的内存。

答案 5 :(得分:0)

#include<stdio.h>

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

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

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

答案 6 :(得分: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*/