大型连续剧:从菜鸟到大佬之初识指针篇

欢迎大家收看大型连续剧:从菜鸟到大佬之初识指针篇
在这里插入图片描述

提示:😁😁😁😁😁先赞后看,养成习惯😁😁😁😁😁😁

请添加图片描述

提示:本文章只是对C语言的指针做初步了解,让大家对指针有初步的了解

一、指针是什么?

我们都知道在内存中大小我们是以字节为单位来计算的,而且每一种数据类型都会在内存中占有一定大小的空间。接下来我用一个通俗一点的故事来给大家讲讲什么是指针?比如说,某一天你有十分紧急的事,需要找到小明才能解决,这个事情非常复杂,电话里一时半会还说不清楚,必须当着小明的面给小明看看问题了才能让小明明白你的困处,于是你从记事本上翻到了小明家的住址,于是跟着小明家的地址”顺藤摸瓜“来到了小明家,小明看了看便说“有手就行”🐵🐵🐵😀😀…

我们故事中所提到的小明就相当于一个变量
而小明家的地址就类似于我们所说的指针(也就是这个变量的地址)
而这个记事本呢就相当于一个指针变量,专门用来存放地址的
在这里插入图片描述
当然在一个小区里面不可能就只有小明一家人吧,肯定还有其他人啊,他们也会拥有自己的地址和具体的独一无二的门牌号吧。同理,在一个内存中肯定不止一个字节的空间,内存中有很多空间,而且这些空间都有他自己的地址(也就是指针),因此指针其实就是一块空间的地址也就是地址的别称,而存储指针的东西,为了和其他数据类型区别,我们给他取了个名字,叫指针变量

二、指针有那些类型?

根据基本类型的话
char -> char*
short -> short*
int -> int*
long ->long*
float -> float*
double -> double*
long long - >long long*
如果学了结构体的话还有结构体指针
一个int 我们知道他占4个字节(32位下),那他是不是有4个地址?答案是对的
但是为了表述方便我们在指针变量里放的通常是它首字节的地址,而没有放他的4个地址
其他类型也是一样的

二、指针有多大?

想一想当初我们求char,int ,short …是怎末球的,我们是不是用到了一个叫sizeof的”家伙“来帮我们计算的,现在我们按照同样的逻辑来计算一遍

int main()
{


	printf("%zu\n", sizeof(char *));
	printf("%zu\n", sizeof(short *));
	printf("%zu\n", sizeof(int *));
	printf("%zu\n", sizeof(long *));
	printf("%zu\n", sizeof(float * ));
	printf("%zu\n", sizeof(double *));
	printf("%zu\n", sizeof(long long *));

	return 0;
}

这是在32位机器下测试的(在64位机器下的话,是8,读者可以下去自行测试😁😁😁)
%zu打印无符号整数的

是不是有点意外,怎么都是4(占4个字节)
接下来,我来给大家解释解释


三、指针大小的硬件背景?

在这里插入图片描述

我们知道对于一个32位机子的电脑来说,他有32根地址线对吧,每根线都会传输一种信号,既要么是0,要么是1,那么32根线的话是不是就对应0000000 00000000 00000000 00000000~~11111111 11111111 11111111 11111111这么多种情况嘛,你看这最大也是不是就占32位嘛,也就是4个字节
因此我们定义了指针变量这个类型,并且给这种类型分配了4个字节的大小
因此不管是char*,short*,int *…等等类型,他们都是指针,只要是指针就会只有4个字节的空间(不管他是什么指针)(当然前提是在32位的平台下,在64位的话,其他同理,只不过此时指针的大小不再是4个字节,而是8个字节了)

思维拓展

其实地址(指针)相当于一个门牌号,也就相当于一个无符号整数,而无符号整数是不是也占4个字节
那我们可不可以用unsigned int 来存放一个变量的地址呢?
假设
在这里插入图片描述

int main()
{
	int a = 10;
	int* pa = &a;
	unsigned int ppa = &a;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
既然是一样的话,我们来看看通过解引用,能不能达成一样的效果呢?
先对pa操作
在这里插入图片描述
显然通过pa里面的地址轻松改掉a的值
接下来我们来看看操作ppa能不能达到相同的效果
在这里插入图片描述
在这里插入图片描述
但是如果我们再定义一个指针变量inttmp再把ppa赋值给tmp。在对tmp解引用改变a的话还是可以成功(但是会报警告)
在这里插入图片描述
这我们不禁就会想why?
其实啊,尽管pa和ppa里面放的都是a的首地址,但是他们给计算机的反馈却不一样
比如:我们不是说a有4个直接嘛也就是有4个地址我们再用
pa对a中的值进行改变时,实际上计算机接收到的是a的所有地址(4个字节的地址),这样我们是不是就能精准定位到a的位置了,是不是就能精准的对a进行改造了;也就是说如果用指针变量的话,计算机就会知道你所有地址(根据首地址往下推),这样就能对你进行精准操作了;而如果是使用unsigned int 的话他反馈给计算机的就是a的首地址,计算机不会往下推它的其他地址,因为它跟不知道要往下推多少个字节,才是变量的精准位置,因此自然就不能间接改变变量了,而后期用了int *tmp来接受ppa的值实际上就此时tmp就相当于pa了。

都看到这了😁😁😁😁😁
码字不易,能否可怜可怜博主给个一键三联再走😭😭😭😭
在这里插入图片描述

评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南猿北者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值