1、指针是一种类型
????????在不同的系统内,指针类型的大小是不一样的,32位系统内指针类型的大小为32位,即4字节,64位系统内指针类型的大小为64位,即8字节。可以使用sizeof函数来分别验证一下,char*、short*、int*、float*、double*这些数据类型的大小。 ???????? 测试代码
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(float*));
printf("%d\n",sizeof(double*));
return 0;
}
????????运行结果 ????????由于我的电脑是64位系统,所以测试的这些指针类型都是8字节。
2、指针的本质是地址
????????指针的本质是地址,这句话可以理解为" 指针==地址 "。
????????首先我们来看看以下几个问题: ????????什么是地址? ???????? ????????地址是对内存空间的一个标号,用来标识每一个内存存放空间。 ????????什么是数据的地址? ???????? ????????数据的地址是指为该数据所分配内存空间的首地址。 ????????地址的表示方式是什么样的? ???????? ????????在计算机中,往往不用10进制表示地址,而选择使用16进制,因为表示起来更加简易。
????????为了方便理解,我们可以跟现实生活中的例子进行结合。比如,比如把指针看做电话号码,当我们没有保存电话号码,直接输入电话号码,进行拨号,这个过程可以看作直接访问;当我们先保存了电话号码,并对其进行了备注,便可直接利用保存的号码进行拨号,这个过程可以看作间接访问。 ????????直接访问示例
int a=10;
printf("%d",a);
????????间接访问示例
int a=10;
int *p=&a;
printf("%d",*p);
????????注意:要区分指针的类型,指针类型决定了该指针存放什么类型数据的地址。比如上面的int *p它是整型数据的指针,因此我们要用整型变量的地址来初始化它,并且这个地址是存放数据空间的首地址。
3、指针有“两个值”
????????指针有两个值,这两个值分别是: ???????? ????????1、指针自身空间存放的值(自身的值) ???????? ????????2、指针所指向空间存放的值(指向的值) ????????下面给出一个实例,可以通过观察这个实例中变量值的变化来很好的理解指针的这一知识点。
#include<stdio.h>
int main()
{
printf("----------------------------初始化-------------------------\n");
int a = 10;
printf("变量a的地址:%x\n",&a);
int b = 20;
printf("变量b的地址:%x\n",&b);
int *p = NULL;
printf("一级指针变量p的地址:%x\n",&p);
printf("一级指针变量p空间内存放的值:%d\n",p);
int **s = NULL;
printf("二级指针变量s的地址:%x\n",&s);
printf("二级指针变量p空间内存放的值:%d\n",s);
printf("----------------------------赋值-------------------------\n");
p = &a;
printf("一级指针变量p的地址:%x\n",&p);
printf("一级指针变量p空间内存放的值:%d\n",p);
printf("一级指针变量p所指向空间存放的值%d\n",*p);
s = &p;
printf("二级指针变量s的地址:%x\n",&s);
printf("二级指针变量p空间内存放的值:%d\n",s);
printf("二级指针变量s所指向空间存放的值%d\n",**s);
return 0;
}
????????运行结果 ????????为了方便观看,这里将它们用图形绘制出来,其中矩形表示内存空间、矩形左侧的字母表示变量名、矩形中间的值表示空间内存放的值、矩形下发的值表示空间地址。 ????????初始化阶段,各个空间的值如下图所示:
????????赋值阶段各个空间的值,如下图所示:
????????值得注意的是,p指针保存了a的地址,我们认为p指针指向a的空间。二级指针s保存了p指针空间地址,我们认为s指针指向p的空间。如下图所示:
????????这种指向只是方便我们对指针的理解,计算机中并不存在这种箭头指向,这种指向关系是通过在一个空间中存放另一个空间的地址来实现。 ????????在上面的基础上,我们来整理一下,实例中赋值阶段两个指针的"两个值"分别是什么。 ????????指针变量p
p的地址(&p):0x62fe40
p的值(p):0x62fe4c
p指向的值(*p):10(变量a的值)
????????此时指针变量p的两个值分别是,p的值:0x62fe4c,p指向的值:10(变量a的值)。 ????????指针变量s
s的地址(&s):0x62fe38
s的值(p):0x62fe40
s指向的值(*s):0x62fe4c(指针变量p的值)
*s指向的值(**s):10(变量a的值)
????????此时指针变量s的两个值分别是,s的值:0x62fe40,s指向的值:0x62fe4c(指针变量p的值)。
4、指针的可操作性
????????指针的可操作性是说,我们可以通过指向某一变量的指针来操作该变量。下面给出一个实例。 ????????实例
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int *p=&a;
int **s=&p;
printf("a的原值为:%d\n",a);
*p = 100;
printf("通过p更改a的值为:%d\n",a);
**s=200;
printf("通过s更改a的值为:%d\n",a);
return 0;
}
????????运行结果
结语
????????对C语言指针的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。
|