当前位置: 首页 > article >正文

指针的基本含义及其用法

1.前言

        在学习C语言的时候,我们会经常接触一个概念,指针和地址,关于这两个概念很多人并不能理解地十分透彻,接下来我将详细介绍一下这两者的概念

2.地址

        我们知道计算机的上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,而内存空间则会进行高效管理,将内存空间划分为一个个的内存单元,而每个内存单元的大小取一个字节。 而一个字节(Byte)等于八个比特位(bit),也就是说,一个字节可以存储八个0和1这样的数据。

        而我们去查找这些储存在内存上的数据的时候,自然是不能从整个内存里面挨个查找的,因为那样效率肯定会十分低下,则这个时候就会用地址去查找了。而地址就类似于你有一个快递,它存放在了菜鸟驿站,到了菜鸟驿站,你是需要向驿站的工作人员提供取件码,然后工作人员根据你提供的取件码找到了你的快递。

        但还有另外一种情况,你去了菜鸟驿站并不知道你的取件码是多少,这时候工作人员会向你索要你的手机尾号,通过查询就得知了你的快递的取件码,这样同样也达到了取到了你的快递的效果。

        这样我们通过上述的概念理解,我们对C语言中取地址符号“&”的理解也就不难了。

举例:

#include<stdio.h>
int main()
{
    int a=0;
    scanf("%d",&a);//&即为工作人员通过你的手机尾号查你的取件码的动作,&a即为工作人员查到了你的取件码的这样的一个结果。
    printf("%d\n",a);//将你的快递拿出来给你看
    return 0;
}

        在上述的代码中,&a产生了a的地址,我们可不可以把它存起来呢?答案是肯定的。

3.指针

        其实,在C语言中我们可以将内存单元编号,地址和指针看作是等价的。但是常说的指针并不是指针而是指针变量。假如说我们定义了一个int类型的变量a,通过取地址的操作,我们知道了地址为0x009FFD30,这时我们想要把它存起来,那就是存储在指针变量中的。指针变量也是⼀种变量,这种变量就是用来存放地址的,存放在指针变量中的值都会理解为地址。

#include<stdio.h>
int main()
{
    int a=0;
    int * pa=&a;//取出a的地址并存储到指针变量pa中
    return 0;
}

        在上述的代码中,我们看到的pa的类型是int*,这里pa左边写的是int*,*说明pa是指针变量,前面的int是在说明pa指向的整型类型的对象。

图解:

 

4.解引用操作符

        我们将地址保存起来,在后面是要使用的,那怎么使用呢?

        在现实生活中我们通过了地址找到了一个房间,在房间里面可以拿去或者存放物品。通过这个逻辑我们理解C语言中的指针,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,在这里就可以引入一个操作符叫做解引用操作符(*)。

#include<stdio.h>
int main()
{
    int a=0;
    int * pa=&a;
    *pa-=9;
    return 0;
}
在上面的代码中第6行就使用了解引用操作符,*pa的意思就是通过pa中存放的地址,找到指向空间,其实*pa就是a变量了,所以*pa=0,这个操作符是把a改成了0。

5.总结

        以上则是关于指针的基本用法的简单介绍了,在C语言中指针扮演者十分重要的作用,内容也是十分的繁杂这里就不再一一赘述了。

 


http://www.kler.cn/a/234566.html

相关文章:

  • 开源项目推荐——OpenDroneMap无人机影像数据处理
  • CTF攻防世界小白刷题自学笔记13
  • Linux基础1
  • 爱普生SG-8200CJ可编程晶振在通信设备中的应用
  • 丹摩征文活动|丹摩智算平台使用指南
  • Flutter Getx状态管理
  • limit深度分页和优化思路
  • Docker 基本介绍
  • 正则可视化工具:学习和编写正则表达式的利器
  • excel统计分析——成组设计和配对设计
  • 微软 CMU - Tag-LLM:将通用大语言模型改用于专业领域
  • 医院挂号预约|医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
  • disql备份还原
  • 【开源】JAVA+Vue.js实现衣物搭配系统
  • 华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例
  • 车载测试Vector工具——常见问题汇总
  • 【C++】多态语法概念
  • springboot174基于springboot的疾病防控综合系统的设计与实现
  • Springboot 2.5.x如何集成Nacos 2.x的配置管理功能?
  • C语言之预处理详解
  • svg基础(八)滤镜-feTurbulence(湍流)
  • Elasticsearch:混合搜索是 GenAI 应用的未来
  • 服务器解析漏洞及任意文件下载
  • 【实验1】分布式模式的CentOS 6上安装Hadoop(1个master节点,2个slave节点)
  • ChatGPT 4:新特性与优势
  • postgresql 手动清理wal日志的101个坑