????????C语言昂,指针昂,最喜欢的一集,小时候学这一课我直接取地址了。上一篇博客给大家讲解了不同类型的指针变量的大小,今天来给大家讲解一下根据其所产生的一些性质。(往期回顾:指针(2)-CSDN博客)
? ? ? ? 根据上一篇博客的意思:既然不同类型的指针变量的大小都是一样的,那么为什么我们还要区分指针的类型呢?为什么不直接用一种通用类型的指针来涵盖所有的指针呢?这种想法其实我也有过,就像秦始皇统一度量衡一样,假如有个统一的指针类型,那么我们用(学)指针不也很方便易懂了吗?但经过后面的学习发现,事情没有想象得这么的简单,听我娓娓道来:
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
printf("%p\n", p);
return 0;
}
????????我们来看这个代码,我们将a初始化为10,然后用p这个指针来存储a的地址,然后我们打印出p来看看(其实打印的就是a的地址。)
? ? ? ? 我们可以看到用inr来当作指针的类型,然后打印出的p是这样的,接下来我们将其+1
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
printf("%p\n", p );
printf("%p\n", p+1);
return 0;
}
? ? ? ? 我们发现p的值(a的地址+了4个字节),而这4个字节就是int类型所占的空间,所以说我们推断在不同类型的指针进行计算的时候,运算的是它类型的大小,假如说int类型的指针进行+1运算,实际上是+了4个字节;但用double类型的指针进行+1,就会+8个字节……这是我们的猜想,让我们来用代码进行实现,验证一下这个猜想:?
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
double a = 10;
double* p = &a;
printf("%p\n", p);
printf("%p\n", p+1);
return 0;
}
?
? ? ? ? 因为是16进制表示的地址,所以说我们对double指针+1?,实际上是+了8个字节的;让我们来试试char类型呢?
? ? ? ? 正好,char类型的指针+了1个字节,这和我们的猜想一样——这就说明了当我们对指针进行运算时,加减的是指针类型的大小。这也就侧面说明了为什么不能统一指针类型,当我们指针的运算有了一定的了解之后,我们可以为指针与数组的结合又埋下伏笔了。?