指针初步理解

     理解指针之前我们先看看我们的一般变量,如int a;那这一句话在编译器去编译的时候会做什么呢,他会在内存里面分给我们一块区域,这块区域的名字就叫a了。那这块区域有什么特点和性质呢?首先特点:这块区域名字我们给了叫a,可存储的东西是int类型的值。性质:每块区域都有一个自己的物理地址编号。

    说到我们的指针,如int*  p;这是我们在定义一个指针的时候,表示定义了一个int*类型的东西叫p;这里的*号只是一个标志作用。要与我们使用时的*号区分开。和定义整形变量类似,定义一个指针变量编译器也是相同操作,从内存里分一块区域给我们,叫做p,可存储的东西是int类型变量的物理地址编号,同时他也有自己的物理地址编号。

使用:p=&a; printf("%d",*p);

可以看到上面使用时有三种东西,第一个是&a, a是我们刚才定义的int型变量,&叫取地址符号,&a就表示把a的地址取出来,那么&a的结果就是a的地址了。第二个是p,这里的p相当于我们使用变量a一样,a=1;那么p=&a,我们刚才说的p是用来保存地址的,所以将&a得到的地址结果赋值给p来保存。第三个是*p,p我们知道是存储的a的地址,如果我们打印p,就会出现的是a的地址的值,那么打印*p会是什么东西呢,会是a的值。这里我们重新认识一下*号和&符号,&符号还有一个作用是引用,我们可以叫他引用符号,&a看起来是将a从变量值得到地址,而*号看起来是按照地址去得到变量的值,所以*号在这里也叫解引用符号,*p这个过程就叫解引用。

数组:int b[10];

对于数组,我们知道数组名是一个指向数组首元素地址的指针,也就是指向b[0]这个元素的指针。

指针的加减:我们知道数学上的加减法,例如2+1=3;那我们将加法推广一下,变成一个广义上的加法,如字母A +1我们自然想到等于B,比如我们的房间号,1号+1=2号,都是下一个该形式的东西。那我们的指针,我们知道指针其实保存的是地址,那地址加1是什么呢,那就应该是下一个地址。那b表示b[0]的地址,那b+1呢,自然就表示b[1]的地址,那可不可以b-1呢,如果地址存在的话,那当然也是可以的,就表示b[0]前面的一块区域的地址(这里要注意,我们申请一个变量,编译器是随机给我们分配区域,所以申请两个变量,可能地址不连续,之间是断开的,但是我们数组申请,是分配连续的区域,分配的区域都是一个接着一个的。

那我们接下来看一下数组的首地址这个东西。

 

 

 

首先b[0]值为1在我们预料之中,b[0]的地址是1703676这也很正常,内存分配的物理地址编号。接下来b的值是170363,也在我们预料之中,和b[0]的地址一样。接下来*b的值也和我们预料一样,b是b[0]地址,*b是解这个地址得到的值。但是最后一个东西出现问题了,&b的值是170363。

回到我们刚才说的,定义一个变量,定位区域名字,分配一块区域,有区域的物理地址,规定存储的东西,放存储东西。四个东西,区域名字,物理地址,存储类型,存储的值。但是这个b[0]似乎有点特殊,区域名字:b[0],物理地址:170363,存储类型:int,存储的值:1。

对于b来说,区域名字:b,物理地址:170363,存储类型:int的地址,存储的值:170363。

  可以看到在170363这块区域上不止有一个东西,出现了两个东西。

  那是不是在所有的变量的物理地址区域上都带有一个指针或者说所有的数组元素的物理地址上附带有这样一个指针呢?答案是没有,我们可以用代码验证一下,

假设是都有的,那么代码 &&a和&&b[1]或者代码b++应该通过我们的测试可以运行,但是这三个代码都会报错,第一二个代码表示,a和b[1]的地址,还可以继续取地址,这样就类似于&b,但是很可惜不行,当然报错原因是&&不能连用,因为一个&就得到的是一个地址值,而&对一个数值是不起作用的。第三个代码表示,如果b[1]上也有这么一个指针,那么b应该可以位移过去,但是很可惜,报错了,b是常量指针,不能位移过去,那我们虽然没有证实其他变量或者数组其他成员有没有类似的指针存在于地址上,但是我们不能得到这样的一个指针,那我们相当于他们上面没有这样的一个指针。

未完待续。如有错误,欢迎指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值