深度理解指针(1)

哈喽各位小伙伴们,相信经过几天的学习对C语言已经有了初步了解,但只有学习了指针才是真正走进了C语言的大门。废话不多说直接进入主题吧!

目录

一、指针的初步认知

二、指针变量和解引用操作符

三、指针变量的大小

四、指针的解引用操作

五、地址的+-

六、void*类型指针

一、指针的初步认知

先简单讲解一下指针是什么,举个简单的例子,警察叔叔要找你,指针好比你的家庭住址的房间号,能够快速找到你啦。

对比计算机中,计算机在读取信息的时候,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值