祛魅:其实指针这块儿并不难,有人说难只是因为基础到进阶没有处理好,大家要好好跟着一步一步学习,今天我们先来认识一下指针
指针定义:指针就是内存地址,指针变量是用来存放内存地址的变量,在同一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*则都改掉了
这样我们就可以理解这句话了
今天我们就先说到这里,给大家打下一个良好的基础,下次我们再一步一步来学习!