在C++中使用堆中指针。

问题描述 投票:0回答:1

我正在学习C++的基础知识,在学习指针的时候遇到了这个问题。我明白 * 是用来访问指针中存储的地址值。那么如果我要这样做。

int *p;
p = new int[5];

为什么第二行会在堆中创建一个数组 并将数组的地址存储在... ... p? 我们没有取消定义 p 在第二行中,通过做 *p. 据我有限的知识告诉我,这样做 p=value 会将该值存储在指针的 p 当我们应该将该值的地址存储在指针的 p.

c++ pointers heap
1个回答
0
投票

理解指针可能很难。

假设有一栋房子,在 "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= ... 不加星号,就是把地址改成了别的房子。


3
投票

我们在第二行中并没有通过做*p来取消对p的引用。

这是件好事。在第一行中,指针没有初始化,所以它没有指向任何东西。试图通过一个不指向对象的指针间接访问虚指的对象,会导致未定义的行为。

通过分配指针而不间接通过它,指针本身被修改,而不是指向对象。

就我有限的知识告诉我,做一个p=value,就是把这个值存储在指针p中了

这正是我们要做的,当这个值是一个对象的地址时。


P.S.这个例子会泄露内存。避免使用裸露的自有指针。使用 std::vector 以创建一个动态阵列。

© www.soinside.com 2019 - 2024. All rights reserved.