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

C语言指针学习 之 指针是什么

前言

        指针是C语言中一个重要概念,也是C语言的一个重要特色,正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针,也可以说不掌握指针就没有掌握C语言的精华。

一、什么是指针

        想弄清楚什么是指针,必须先弄清楚数据在内存中是如何存储的,又是如何读取的。

        如果在程序中定义了一个变量,在对程序进行编译时系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型分配一定的长度空间,如visual C++为整型变量分配四个字节,为字符型变量分配一个字节,内存中的每一个字节都有一个编号,这就是“地址”。它相当于旅馆中的房间号,在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。

        由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。打个比方:一个房间的门口挂了一个房间号2000,这个2000就是房间的地址,或者说2000指向该房间,因此将地址形象化地称为“指针”,也就是说通过它能找到地址的内存单元。

        说明(非常重要) 在C语言中,数据是分类型的,对不同类型的数据,在内存中分配的储存单元(字节数)大小也不一样的,存储方式也是不同的(如整数是以补码的形式存放的)。如果指定了地址是1010,要从带单元中调出数据是做不到的,虽然能找到对应的存储单元,但时不能确定是从一个字节还是2个字节还是三个字节取数据,也没有说是按何种存储方式进行存储数据的,因此C语言的地址包括位置信息(纯地址)和它所指向的数据的类型信息,如&a,一般称它为变量a的地址。

二、直接访问和间接访问

        在我们进行指针学习的过程中,一定要弄清楚存储单元的地址存储单元的内容这2个概念。

图1 

        如图所示程序已定义了3个整型变量ijk,在程序编译时,系统可能分配地址为2000~2003的4个字节给i,2004~2007的4个字节给j,2008~2011的4个字节给k。

        在程序中通过变量名来应用变量的值,例如:

        printf("%d",i);

        在执行上面语句时,首先通过变量名找到对应的地址,从该四个字节中按照整型数据的存储方式读出整型变量i的值,然后按十进制整数格式输出。(对变量的访问都是通过地址经行的)

       scanf("%d",&i);

        在执行时,把键盘输入的值送到地址为2000开始的整型存储单元中,如果有语句:

        k=i+j;

      就是从2000~2003的4个字节中取出值(3),2004~2007的4个字节中取出值(6),将它们相加再将其和(9)送到k所占用的2008~2011的4个字节。

        这种按变量名直接进行的访问,称为“直接访问”方式。

        还可以采用另一种称为“间接访问”的方式,将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问i变量。

图2

         结合图1和图2,定义一个变量i-pointer用来存放整型变量的地址,可以通过下面语句将i的地址(2000)存放到i-pointer中:
        i-pointer=&i;

        这时,i-pointer的值就是2000,先找到存放变量i地址的变量i-pointer,从其中得到变量i的地址,从而找到变量i的存储单元,然后对它进行存取访问。

        为了将3送到变量中,可以有2中表达方式

        1.将3直接送到i所标识的单元中,例如i=3;

        2.将3送到i-pointer所指向的单元(即变量i的存储单元),例如*i-pointer=3;其中*i-pointer表示i-pointer的指向。

        指向是通过地址来体现的。假设i-pointer中的值是变量i的地址,这样i-pointer和i就建立了一种联系,通过i-pointer知道i的地址,从而找到i的存储单元。

三、指针变量(简讲,下一期详细讲解)

        如果有一个变量专门用来存放另一个变量的地址,则称它为指针变量,上述的i-pointer就是指针变量,指针变量就是地址变量,用来存放地址,指针变量的值是地址。

        注意:可以说变量i的指针是2000,而不能说i的指针变量是2000,指针是一个地址,而指针变量是存放地址的变量。

        小编下面给大家举一个例子认识一下指针变量:

        通过指针变量访问整型变量

#include<stdio.h>
int main()
{int a=100;int *hz;  hz =&a;printf("a=%d \n",a);printf("*hz=%d \n",*hz);return 0;
}a=100 
*hz=100 
PS C:\csay\cyuyan> 

小结 

        指针是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,希望通过小编的介绍,能够帮助大家更好的学习知识,同时也希望大家对小编的不足之处即使指出,小编将在第一时间进行修正。

🚀感谢:给读者的一封信


亲爱的读者:

       这篇文章中我投入了大量的心血和时间,希望为大家提供有价值的内容。

        如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

        如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

                            

相关文章:

  • python验证服务器或容器端口是否可以用
  • Linux(ubuntu) -- 安装后调配
  • C语言实现12种排序算法
  • kubernetes内外网通信-集群外节点访问 pod ip
  • k8s二进制及负载均衡集群部署详解
  • grafana安装DevOpsProdigy KubeGraf 1.5.2
  • 协作办公开源神器:ONLYOFFICE
  • BrainAGE作为大脑老化的神经影像标志物的十年
  • 微信小程序for循环嵌套
  • css3 属性 backface-visibility 的实践应用
  • map和set封装
  • unity addressables 加载资源和场景 显示进度条(主要用于WebGL)
  • postman之接口参数签名(js接口HMAC-SHA256签名)
  • PyTorch的nn.Module类的详细介绍
  • 【JavaEE进阶】 图书管理系统开发日记——贰
  • php的引用
  • 10个确保微服务与容器安全的最佳实践
  • Android 控件背景颜色处理
  • ES6 ...操作符
  • ES6核心特性
  • JAVA 学习IO流
  • Javascript基础之Array数组API
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Mybatis初体验
  • MySQL用户中的%到底包不包括localhost?
  • Netty 4.1 源代码学习:线程模型
  • php面试题 汇集2
  • PV统计优化设计
  • python 装饰器(一)
  • Python连接Oracle
  • Shadow DOM 内部构造及如何构建独立组件
  • Travix是如何部署应用程序到Kubernetes上的
  • 编写高质量JavaScript代码之并发
  • 翻译:Hystrix - How To Use
  • 聚簇索引和非聚簇索引
  • 力扣(LeetCode)21
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 入口文件开始,分析Vue源码实现
  • 微服务核心架构梳理
  • 移动端唤起键盘时取消position:fixed定位
  • 在Unity中实现一个简单的消息管理器
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • UI设计初学者应该如何入门?
  • zabbix3.2监控linux磁盘IO
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​linux启动进程的方式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $().each和$.each的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)fread与fwrite详解
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (solr系列:一)使用tomcat部署solr服务
  • (vue)页面文件上传获取:action地址