如何声明和分配指针

how to declare and assign pointer

本文关键字:分配 指针 声明 何声明      更新时间:2023-10-16

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

int *p = &1000;
Output: error : & on Constant
int *p = (int *)1000;
Output: 0000003E8
int *p = new int(1000);
Output: 1000

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

参考

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

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

顺便说一句:你实际上是在定义一个指针,而不仅仅是声明它

extern int *p;

这告诉编译器在其他地方定义的指针的存在(即,在其他翻译单元中)。它最常出现在页眉中。由于它只是告诉编译器关于指针的信息,因此不能包含声明。

根据您的评论,

当我尝试*p时,它显示1000。现在,不管你有什么。

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

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

int *p = new int(1000);

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

注:

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

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

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

运算符的地址不能应用于引用页中提到的常量。

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

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

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

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

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

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

#include<stdio.h>
int main()
{
int *ptr = (int *)1000;
printf("%dn", ptr);
return 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*/