9.2.1 指针运算

1.指针计算

1+1=2吗?这个问题太幼稚了是吧,小学一年级就知道了嘛.1+1肯定等于2,可是如果我问你,一个指针加一,它的结果是加了一那个数字吗?我们来试试看:

运行结果:

乍一看好像没错是吧,我们再来试试这段代码:

运行结果:

我们发现q和q+1相差4,4是什么?sizeof(int).它不是在地址值上加1,而是在地址值上加一个sizeof(int);我们给指针做+1的操作,实际上是要把它移到下一个单元去.

那既然这样,我们又想起一件事情来.因为我们在讲到指针和数组的关系的时候,我们提到过说,当你把一个数组赋给一个指针以后,你可以拿那个指针像数组一样操作,你也可以拿数组变量像(const)指针一样操作.也就是说,*p->ac[0];*(p+1)->ac[1];如果我们让这个地址加一的结果是让它原来的地址值加上一,举个例子,2c,你不可能说我加了1之后变成2d,然后再拿后面三个字节来拼凑起来成一个int,这不是一个我们想要的int,这不是在那个数组里面任何一个有效的东西.这没有任何意义.

实际上,对于这样的运算来说:

我们可以对指针做这些运算:

指针做乘除没有任何意义.我们比较疑惑的地方是,两个指针相减得到的结果是什么,我们可以打印一下q1-q的结果:

我们发现说是6,6是什么?q1的地址值减去q的地址值的差值再除以sizeof(int),也就是会告诉你这两个地址之间会有多少个这样类型的东西在,或者说能放多少个这样类型的东西.

我们还有一个经常在程序中看到的比较有趣的写法,*p++:

我们可以来试一下用这样的方式遍历数组:

结果会有两个输出,一个是ac数组所有的值,一个是ac数组除了-1以外的所有值.

2.指针比较

3.  0地址

0地址是怎么回事?我们现代的这些操作系统,无论是Windows,Linux,Unix,macos,这些操作系统都是叫多进程的操作系统,它的基本的管理单元叫做进程,什么是进程呢,你double click一个东西,它运行起来了,它就是操作系统里面的一个进程,对于进程来说,最基本的概念是说,操作系统会给它一个虚拟的地址空间,也就是,所有的程序在运行的时候,都以为自己具有从0开始的一片连续的空间,那个顶是多少呢,如果是32位架构的机器,那个顶就是4GB,当然实际上你用不了这么多,我们很快就会探测你到底能用多少空间.

所以任何一个程序都有0地址,不是说我这个程序用了另外一个程序就不能用了,所有的程序都有一个虚拟的0地址,当然虚拟的物理怎么翻译是另外一回事了,我们有一门课叫操作系统,在那门课里面我们会详细讲这件事.

4.指针的类型

如果我们把p的值交给q,虽然从某种角度上来说,指针都是指针,不管你之前指向char或者int,指针的大小都是一样的,所以由一个q来接收p的变量的值其实是没问题的,这个值是放的进去的,不像说我要把一个double放进int里就放不进去.那有问题的是什么?我们这样做相当于让p和q指向同一片地址,如果你让*q=0,那么它会让p[0]到p[3]都变成0.这显然是不对的.

5.指针的类型转换

初学者不建议使用,但是有时候我们不得不这么做.(第二点存疑,老师没有给出解释)

6.用指针能做什么

我们来总结一下我们能用指针做什么:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值