c/c++中指针的理解(初学者)
关于指针,大家肯定不陌生,一些初学者,想必会出现思绪混乱的情况,现在我就来帮大家缕一缕吧。(第一次写微博 有点小紧张)
大家应该了解一些计算机对内存的管理方式吧。操作系统会将内存单元进行编号,这些编号都是有顺序的,大家应该听过操作系统分为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则是一个变量 指针变量 用来指向地址的 ,所以才会有这样 int*p; 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
;