关于指针

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


转载至:http://blog.csdn.net/Allen_ww/article/details/50499219?ticket=ST-348812-jpMbOoA4EQ4Em1pxxJZ3-passport.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值