理解C语言指针概念只需几分钟

280318da8099bc71e8822a64f21ad45d.png

点击上方蓝字关注我,了解更多咨询

7517e2315be3aee47e2f46ed9fab998a.png

当我们声明一个变量或常量时,计算机系统会为这个变量或常量分配存储单元,变量的数据存储到被分配的存储单元内,对变量的赋值和取值操作都是针对存储单元的操作。

C编译器是如何通过变量找到与其对应的存储单元呢?实际上变量是被分配单元内存地址的名称,对开发者来说,记住一个变量名称要比记住用十六进制表示的内存单元地址更加简单,因此变量是内存单元地址的名称表示,开发者可以通过变量名来访问内存单元中的数据。下图给出了变量、数据和内存地址之间的关系。

2ab96df81a8c86c922f5140b160f01ad.png

我们知道“&”运算符是获取变量的内存地址,下面做一个实验,连续声明三个整型变量a、b、c,然后使用“&”运算符取出变量a、b、c的内存地址并输出到控制台。

#include <stdio.h>
void main()
{


int a = 20,b=10,c=0;
printf("变量a的内存地址:%d\n",&a);
printf("变量b的内存地址:%d\n",&b);
printf("变量c的内存地址:%d\n",&c);
}

输出结果如下:

1b8bfbba4576cba250b45670a0632ceb.png

由于内存对齐的原因,实际每个int占用了12个字节的存储空间,内存对齐主要是为了快速访问内存的数据。从输出结果图可以看出,变量a、b、c指向的存储空间连续占用了36个字节的内存。

C语言把变量的内存地址作为一种可处理的数据,称为指针值,以内存地址为值的变量称为指针变量,简称指针(pointer)。使用指针变量可以保存变量等程序对象的地址,通过它们就可以访问和处理变量等有关对象。

例如:a是一个整数类型的变量,a的值为0x20,变量a的内存地址为0xaffe,变量ptr存储变量a的内存地址0xaffe,则称ptr为指针变量,通过ptr可以直接存取变量a的值。

6cd678e6c632c20ae4280552bcf8fc86.png

指针变量ptr名称前面带有“*”符号,表示这是一个指针变量,它存储的是其它变量或程序对象的内存地址。由于指针变量存储了其它变量或程序对象的地址,因此通过指针变量可以访问或修改它们的内容。

和其它变量相同,在声明指针变量时,也需要确定一个数据类型,即存储该数据类型变量的地址。例如前面的指针变量ptr只能存储int数据类型变量的地址,而不能指向其它数据类型的变量。

在C语言中,声明指针变量的语法为:

datatype *pointerName;

其中,datatype是数据类型,pointerName是指针变量的名称。符号“*”不是pointerName的一部分,它只是告诉编译器这是一个指针变量,用于存储datatype类型变量的地址。

例如:

// 声明一个存储整型变量地址的指针变量prt

int *prt;

// 声明一个存储浮点型变量地址的指针变量fprt

float *prt;

// 可以在一行语句中声明多个同类型的指针变量

int *p,*ptr;

声明指针变量后,需要初始化和赋值后才能使用,否则会出现意想不到的错误,因为指针变量可以直接对内存进行操作。当声明指针变量时,若暂时不能确定指针变量存储的内存地址,可以将指针变量设置为null:

int *ptr = NULL;

NULL是C语言的一个宏定义,宏定义类似符号常量的定义,都是使用define关键字来定义。NULL表示一个0指针,既不存储任何内存地址的指针。

8d22bda6344bad4c0c9fc649a44603d7.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

93ef19a874f46480fc17beb67aa388da.png

52214168bbd1b89d4b7c7410a975e9d3.gif

戳“阅读原文”我们一起进步

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值