今天我们来学习指针。
地址和指针变量
1.地址
在scanf的使用中,我们都会使用&符号,用来调取地址。&是取地址操作符,由于一个变量的地址是连续的,所以只需要取变量第一个字节的地址。在c语言中我们给地址一个新的名字,即指针。创建变量的实质是向内存申请空间,而这个空间的编号就是其指针(地址)。
这里我们创建了一个变量来观察a的地址,地址实际上是二进制数据,而在vs2022中为了方便展示从而写成了16进制。
2.指针变量
如图中第四行所示,我创建了一个指针变量。额外说明一点就是pa表示的是a的地址,而pa的创建同样需要申请空间,也会有自己的地址。
其中pa:为变量存放地址
int*整体:pa是整型的指针变量;
int:pa指向的是整型;
*:pa是一个指针变量;
解引用
上面我们将a的地址存放在了指针变量pa中,那么我们如何将a拿出来呢 ?
如图所示,,我们会用到解引用操作符*(单目),*pa是解引用操作,表示将a重新拿出来赋值。此时打印出来a便不再是0,而是314。
指针变量的大小
c语言中一个整型为4个字节,一个字符为1个字节...那指针变量也会有自己的大小。实际上指针变量的大小就是指地址的存放需要多大的空间,与平台有关而与其指向的类型无关。在32位机器上,地址线有32根,32个0/1组成二进制序列,占32个比特位,即4个字节。在64位机器上,地址线有64根,64个0/1组成二进制序列,占64个比特位,即8个字节。所以指针变量的大小只可能是4字节或者8字节。
指针类型的意义
1.指针的解引用
指针的类型决定了指针解引用的时候能访问多少个字节。如下。
我们可以发现当指针类型为int*时,可以改变四个字节位,而当指针类型为char*时,只能改变一个字节位,这就反应出指针类型的意义了,即不同的指针类型在解引用时所提供的字节访问权限有区别。
2.指针的加减
同样的,指针类型决定了指针在加减时所偏移的量,如int*+1地址就偏移四个字节,char*+1地址就偏移一个字节。
void*类型的指针
void*类型的指针是指无明确类型的指针,在函数传参的时候他可以接受任意类型的指针。局限是无法对其进行解引用。
指针运算
指针加减整数
指针减指针
两指针相减这两指针一定是指向同一区域;两指针相减的绝对值等于两指针间元素的个数。
指针的关系运算
数组的指针是有高低的,我们将此作为判断的依据。