C之任督二脉之二脉 指针


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语言指针的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值