C++ 中如何理解指针

#include <iostream>

using namespace std;

int main() {
  int *p = new int(55);

  cout << "输出p为" << p << endl;
  cout << "输出*p为" << *p << endl;

  return 0;
}
输出p为0x7fa3aac00020
输出*p为55

new int(55)p 分配了内存 0x7fa3aac00020, 指针 *p 指向该内存中的值 55。这样理解是否正确。

阅读 3.5k
4 个回答

是p指向了 new int(55)被分配的内存的地址 0x7fa3aac00020

一定要注意new int(55)不是给p分配了地址,实际上p有自己的地址,可能是1、2...0x7fa3aac00019,p的地址里面存的是 new int(55)被分配的内存的地址 0x7fa3aac00020

*p取出此地址里的值

new int(55)存储在内存是0x7fa3aac00020的位置,
p 存储的是0x7fa3aac00020, *p 是一个取值的运算,先从p里取出值,然后去这个值(0x7fa3aac00020)标记的位置读取一个 int 型的数据,是55

指针是一种变量类型,和int,double一样里面存放值,不过指针存放的是内存地址。
内存中的每一个字节都有一个地址,而且是唯一的,就跟街道的房子一样,每一栋房子都有唯一的门牌号。
一个变量由多个字节组成,而变量的地址就是该变量内存中第一个字节的地址。

新手上路,请多包涵

操作系统会将内存单元进行编号,这些编号都是有顺序的,大家应该听过操作系统分为32位和64位的吧,这个就是操作系统对内存的最大编号,32位只支持4G的个编号,64位支持8G个编号。举个简单的例子来说明一下吧(很多人都用图书馆,抽屉什么的举例子,其实我也想举这样的例子,但是有感觉太老旧了),我就来拿写日记来说,每一天的日记都会写在一页或者多页上面,而每一页就相当于一个储存单元,页码便是这个储存单元的编号,我们写的日记就相当于数据,我们需要将这些数据写入内存中,但又要知道这些数据存在什么地方,这个时候我们就要记住这个编号了,跟写日记一样,我需要看我写的谋篇日记在哪里,只需要看看目录,这篇日记在那一页就能很快找到,这个更类似于书。
看看代码吧

int a = 10 ;
// 这个大家应该很熟悉, 一个int类型的变量 a ,这个变量的值为10
// 解释一下,我们现在只知道 变量a的值是10 但是我们不清楚 a储存在内存的什么地方
// 我们可以用&符号来看看 a 储存在内存的那个地址里
printf("a的地址=%d n",&a); // a的地址=1606416232

这里大家可能会说我说了一些废话,我来解释一下,说这些只是为后面解释指针做个小小的铺垫。
现在有一种变量 它的值使用来储存地址编号的 这就是所谓的指针,我的理解。
我们来看下面
int* p = &a;
这里想解释一下 关于指针定义是后到底在什么地方,我个人认为应该紧跟在类型的后面。(我的认为是 int 代表整型,int则代表指向int型的指针类型。这样p则是一个变量 指针变量 用来指向地址的 ,所以才会有这样 intp; p=&a)
看看这个
&:表示取地址运算符。
*:表示取变量运算符。
可以看看这个例子。
int b = 51;
printf("%d",*(&b));
这个例子很好的说明了两个运算符。
现在开始细细的讲一下指针了,p是指针类型,它的值只能是地址,p =&a,就是把a的地址赋值给p。现在p的值就是a的地址了,我们知道了a的地址之后,就能很随意的对a进行修改了(这里不包括常量),比如我们p得到这个地址上的数据p =100;,而当我们打印a的时候prinf("%d",a) 的时候,首先a会去对应的地址找到这个地址上的数据,这个时候发现原本这个数据是10,现在变成了100。
p同样也是有储存地址的,&p变可以知道p的地址了,我们想让一个指针的值是p的地址,看看应该怎么做
int* pp = &p //很明显编译器出错,why?
明明 pp是一个指针 它的值也是一个地址 为什么会出错呢?
看看p指针跟pp 有什么不同呢?
*p 可以得到地址上int类型的值。
看看pp
如果上面写法可行
pp也应该得到int类型的值,但是我们通过公式可以看出 pp == p 但是p不是一个int类型 而是int类型。所以这样的定义是不对的
正确的定义大家都是知道的 就是指向指针的指针
int** pp = &p;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题