哈喽各位小伙伴们,相信经过几天的学习对C语言已经有了初步了解,但只有学习了指针才是真正走进了C语言的大门。废话不多说直接进入主题吧!
目录
一、指针的初步认知
先简单讲解一下指针是什么,举个简单的例子,警察叔叔要找你,指针好比你的家庭住址的房间号,能够快速找到你啦。
对比计算机中,计算机在读取信息的时候,CPU从内存中读取信息,并处理返回到内存中。为了高效的管理内存,将内存分为一个个的内存单元,每个内存单元为一个字节。
内存单元的编号为地址,也成为指针(通常为16进制的方式来进行表示),但这些内存单元的地址是不需要存放起来的,是通过硬件设计的。
我们可以简单理解,32位机器有32根地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么一根线,就能表示2种含义,2根线就能表示4种含义,依次类推。32根地址线,就能表示2^32种含义,每一种含义都代表一个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器。
当CPU要读取内存的时候通过控制总线发出要读的信号,通过地址总线来确定要读取的内存地址单元,通过数据总线来进行数据的传输。变量的创建就是向内存申请空间。
二、指针变量和解引用操作符
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;//取出a的指针并存储在变量p中;p成为指针变量
return 0;
}
值得注意的是p的类型为int *,*说明p是指针变量,int 说明p指向的对象是int类型
解引用操作符------间接访问
int main()
{
int a = 10;
int* p = &a;//取出a的指针并存储在变量p中
*p = 30;
printf("%d\n",a);
return 0;
}
三、指针变量的大小
指针变量的大小根据位数的机器的不同大小也不同,例如在X64环境下,有64跟地址线每个地址是由64个二进制位组成,同时一个字节为8个二进制位,所以在X64的环境下指针变量的大小由8个字节组成。同理在X86环境下,指针变量的大小由4个字节组成。
同时小伙伴们会疑惑,为什么不同的指针变量在相同的环境下,指针变量的大小会相同呢?
我们不难想到字符,浮点型,整型,他们在内存上的访问都是都是通过地址总线来进行都是32位或者64位。指针类型的大小和类型无关,只要是指针类型的变量,在相同的环境下大小都是相同的。
四、指针的解引用操作
不同的是,在int*中会一次性访问4个字节,char*中一次只会访问一个字节
五、地址的+-
int* 类型+1会跳过4个字节,char*类型+1会跳过1个字节
在int* pi中pi+1-------1*sizeof(int),在char* pi中pi+1-------1*sizeof(char)
六、void*类型指针
可以兼容任意类型的指针,但不能进行解引用操作和指针的+-整数,但要想进行解引用操作可以通过强制类型转换。
int main()
{
int n = 10;
//char* pn = &n;
void* pv = &n;
*(int*)pv = 200;//通过强制类型转换将void转换成int*类型来进行解引用操作
printf("%d",n);
return 0;
}