我正在学习C++的基础知识,在学习指针的时候遇到了这个问题。我明白 *
是用来访问指针中存储的地址值。那么如果我要这样做。
int *p;
p = new int[5];
为什么第二行会在堆中创建一个数组 并将数组的地址存储在... ... p
? 我们没有取消定义 p
在第二行中,通过做 *p
. 据我有限的知识告诉我,这样做 p=value
会将该值存储在指针的 p
当我们应该将该值的地址存储在指针的 p
.
理解指针可能很难。
假设有一栋房子,在 "GreatStreet no 234"。没有人知道这所房子。
现在,住在其他地方的人A被告知了这个房子。信息只是房子的地址。信息中还有一个加号:它说 "这是一所房子,没有其他东西"。
指路人也是一样。
int *p;
p = new int[5];
int *p
是人A,此刻他什么都不知道,只知道后面会告知一个房子。它与房子有关,而不是与车有关,这是由于 int
. 一辆汽车将是 float
而是。
int[5]
是房子,刚建好的 new
行动。这 new
命令不仅创建了数组,而且还返回了地址,这就是 "GreatStreet no 234"(或其在堆位置的等价物)。
p= new...
告诉A人关于房子的地址。
使用指针的好处是,不仅可以用 "人A"(通过 p
),但也有关于房子的信息(由星号中的 *p
).
所以,如果你使用星号法(dereference),你可以改变房子 *p = 3
. 但你不能改变房子的地址。
如果你改变了指针的信息。p= ...
不加星号,就是把地址改成了别的房子。
我们在第二行中并没有通过做*p来取消对p的引用。
这是件好事。在第一行中,指针没有初始化,所以它没有指向任何东西。试图通过一个不指向对象的指针间接访问虚指的对象,会导致未定义的行为。
通过分配指针而不间接通过它,指针本身被修改,而不是指向对象。
就我有限的知识告诉我,做一个p=value,就是把这个值存储在指针p中了
这正是我们要做的,当这个值是一个对象的地址时。
P.S.这个例子会泄露内存。避免使用裸露的自有指针。使用 std::vector
以创建一个动态阵列。