cpp学习-指针-1

1.int x=3;
int *p= &x;

(1)这一段代码中int* p结合顺序为(int*)p,改为int(*p)则无法通过编译。

(2)此处p代表一个首地址,而下面的使用中p则代表定位到这个首地址,而int和char之类的之前的类型,则起到了确定该指针指向的变量的具体长度,譬如int为4个字节,short为两个字节。同时p+1,会根据p指向的数据的类型来计算,而非真的+1,比如int型+4,short型+2。

(3)因为p实际代表的是一个地址,则在赋值时必须赋予其一个地址。这时候我们就会提出疑问,如果自己定义一个int类型变量当做地址赋予p可不可以。譬如int * p=0xcccccccc,这样是无法通过编译的。

(4)&的作用:一般&代表取地址,&x代表x的地址,如此就有了上面将&x值赋予p的过程。

(5)* 的作用:*代表将一个指针指向变量的值取出,即定位到p指向的地址,并取出相应的长度的数据。譬如int取4个字节,short取2个字节。 *p = *p+1,代表将p所指向的int类型数据值加一。

2.int x[10]

(1)此处定义了一个名为x的int型数组,数组名x在绝大多数情况下代表了该数组的首地址,例外情况暂时不提及。

(2)而在使用时x[2]代表了访问数组的第3个元素,x[4]代表访问数组的第5个元素。那么有没考虑过x[-1]到底访问了什么。
譬如:int x[10];
int y=4;
printf("%d\n",x[-1]);

输出结果竟然是4,也就是y的值。
其实在访问x[i]时,会通过x+i*(x的类型长度)的方式来访问。
此外,其实只要[]前为一个地址的值就可以进行类似数组的访问。
譬如:int x;
int y=4;
printf("%d\n",(&x)[-1]);

输出结果依然为4。

我们会发现,这种x[i]的方式与*(x+i)的方式结果是一样的。
其实不光结果一样,我们看一下两份代码的汇编代码。
这里写图片描述

这里写图片描述

其中lea指令代表把x对应首地址的值加载到eax寄存器中。而在下面的访问则是一模一样的。这也就证明了x[]的访问其实和直接用指针访问是没啥区别的。
建议:希望大家学习编程时,有条件的话能学习一些比较偏向于底层的东西,而不是执着于一些表面的语法。

3.int ** x;
指针的指针:就是指向某个变量的指针的指针,我觉得大家如果上面都看懂的话,估计这个概念理解起来没有啥问题。

4.int y=4;
int & x=y;

上次看到有人函数里用int * &x 类型传指针,结果和int * x的结果一模一样,我感到无比震惊。结果鼓捣了一下午,看完了汇编,弄懂了之后,查了一下,发现原来这是引用变量,&在这里并不指地址操作符。
于是最后再说一下引用类型的原理。
引用类型是相当于为变量y起了一个别名叫x。修改其中任意一个值,另一个都会相应的改变。譬如x=3;则y的值也会变成,反之依然成立。
乍看起来觉得很神奇,其实看一眼汇编:
这里写图片描述
解释一下,首先把3放进了x对应的内存地址内,然后
int & y=x就是把x的地址放进了y对应的地址单元内,
而y=4则是首先取出其中的x的地址,然后以此为指针,去访问到对应的x单元。

感谢观看,如有错误和不足望指正。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值