我想用一个值(如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);
这会在堆上为 a 分配空间,并使用对空间进行int
值初始化1000
。
笔记:
在堆上为单个分配空间int
有时可能是必要的,但大多数时候它不会有用,因为 anint
是一个非常小的对象。指针很可能同样大或更大,因此传递指向 a 的指针int
,而不是传递int
自身,用途有限。
如果你真的认为你需要这个,请记住,你需要稍后释放该空间,使用
delete p;
一般而言,大多数时候您需要在堆上分配空间并维护指向它的指针,最好使用智能指针(例如C++11 中的std::unique_ptr<int>
或std::shared_ptr<int>
)来避免考虑释放。
运算符的地址不能应用于参考页面本身中提到的常量。
目前尚不清楚为什么要以这种方式初始化指针。最好将常量分配给另一个变量并在它们上使用运算符的地址。
如果指针值将在代码中的某处更改,那么最好用 NULL 初始化指针。
第一个是错误的(正如在接受的答案和您的编译器中指出的那样)
第二个似乎是正确的,但我不确定您在显示什么。您可能会显示由 p 表示的地址而不是它的值。尝试显示 *p 而不是只显示 p
第三个似乎是正确的,但仅适用于 C++ 而不是 C
编辑:
这就是您实现 Jay 答案的方式
int a = 1000;
int *p;
p=&a;
整数 * p = 新整数;*p = 1000;
这就是你想要的。第一个字符串为整数分配内存,第二个用 1000 初始化它。不要原谅写“delete p;” 当您在程序中不再需要它时释放与 p 相关的内存。
#include<stdio.h>
int main()
{
int *ptr = (int *)1000;
printf("%d\n", 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*/