C语言指针系列1——初识指针

祛魅:其实指针这块儿并不难,有人说难只是因为基础到进阶没有处理好,大家要好好跟着一步一步学习,今天我们先来认识一下指针


指针定义:指针就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。

有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

有些小伙伴可能问题重重,我们一句一句的解释~

 指针变量是用来存放内存地址的变量

首先,假设我们的内存长这样

以变量a为例,指针变量为p

我们发现p就和门牌号一样,指向了变量a,p就是a的地址,也是a的指针

那么如何用代码来表示呢?

这个时候就要引入进来两个符号了,& 取地址,* 解引用,下面依然以变量a为例我们来写一下代码 

#include <stdio.h>
int main() {
	int a = 10;
	int* p = &a;
	printf("%p\n",p);
	printf("%p\n", &a);
	return 0;
}

我们可以看到,他们的结果是一样的,都是a的地址,其中  int*  是指针变量中的int类型,而 & 符号则为取地址符号

 在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的

 我们都知道,变量类型有 int , double , float ,char , short 等

同样的,指针变量也有这些类型  int* , double* , float* ,char* , short*(PS:也可以中间空一格再打出*,如: int   *   )

那么 不同类型的指针变量所占用的存储单元长度是相同的 到底对还是不对呢,这个时候我们突然想起来 sizeof 好像可以计算字节,那么我们就可以用代码来试一试

#include <stdio.h>
int main() {
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));

	return 0;
}

我们发现无论是哪种类型,指针变量都是8个字节,这是在x64的环境下 

而在x86,也就是32位的情况下,又是几个字节呢?

这个时候我们发现在x86下则是四个字节 

这就是为什么说是 在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的

 而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同

这句话又该怎么样理解呢?

首先我们先来写个代码对比一下,这里是以 int* 和 char* 作对比

#include<stdio.h>
int main() {
	int n1 = 0x11223344;
	char* pi = (char*)&n1;
	*pi = 0;
	printf("%x\n", n1);

	int n2 = 0x11223344;
	int* pc = &n2;
	*pc = 0;
	printf("%x\n", n2);
	return 0;
}

我们发现他更改的字节不同,char*只能改一个字节,而int*则都改掉了

这样我们就可以理解这句话了


今天我们就先说到这里,给大家打下一个良好的基础,下次我们再一步一步来学习! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Re.不晚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值