当前位置: 首页 > 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元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

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

                            

相关文章:

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

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

【文本到上下文 #10】探索地平线:GPT 和 NLP 中大型语言模型的未来

一、说明 欢迎阅读我们【文本到上下文 #10】&#xff1a;此为最后一章。以我们之前对 BERT 和迁移学习的讨论为基础&#xff0c;将重点转移到更广阔的视角&#xff0c;包括语言模型的演变和未来&#xff0c;特别是生成式预训练转换器 &#xff08;GPT&#xff09; 及其在 NLP 中…...

(四)elasticsearch 源码之索引流程分析

https://www.cnblogs.com/darcy-yuan/p/17024341.html 1.概览 前面我们讨论了es是如何启动&#xff0c;本文研究下es是如何索引文档的。 下面是启动流程图&#xff0c;我们按照流程图的顺序依次描述。 其中主要类的关系如下: 2. 索引流程 (primary) 我们用postman发送请求&…...

飞天使-k8s知识点16-kubernetes实操1-pod

文章目录 深入Pod 创建Pod&#xff1a;配置文件详解写个pod的yaml 文件深入Pod 探针&#xff1a;探针技术详解 深入Pod 创建Pod&#xff1a;配置文件详解 资源清单参考链接&#xff1a;https://juejin.cn/post/6844904078909128712写个pod的yaml 文件 apiVersion: v1 kind: P…...

【gcc】webrtc发送侧 基于丢包更新码率

参考大神的分析1 rtt 有问题:网络拥堵,直接下调码率 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_bandwidth_estimation.hRttBasedBackoff RttBasedBackoff rtt_backoff_;class RttBasedBackoff {public:explicit RttBasedBackoff(const WebRtcK…...

数字经济的未来:探索Web3的商业模式

随着技术的不断演进&#xff0c;Web3正逐渐成为数字经济发展的关键驱动力之一。在这个数字时代&#xff0c;我们目睹着Web3为商业模式带来翻天覆地的变革&#xff0c;探索着数字经济未来的可能性。 1. 去中心化的商业生态 Web3以去中心化为核心理念&#xff0c;打破了传统商业…...

Centos7部署MetaBase-v0.48.3

MetaBase_v0.48.3下载地址 : http://downloads.metabase.com/v0.48.3/metabase.jar JDK11 下载地址&#xff1a;https://repo.huaweicloud.com/java/jdk/11.0.113/jdk-11.0.1_linux-x64_bin.tar.gz 1.不修改源数据库的方式 官方提示此方式仅用于测试学习使用&#xff0c;如用生…...

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…...

解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?

作者&#xff1a;饶子昊、杨龙 应用复杂度提升&#xff0c;根因定位困难重重 随着软件技术发展迭代&#xff0c;很多企业软件系统也逐步从单体应用向云原生微服务架构演进&#xff0c;一方面让应用实现高并发、易扩展、开发敏捷度高等效果&#xff0c;但另外一方面也让软件应…...

【OJ比赛日历】春节快乐 #02.10-02.16 #9场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-02-10&#xff08;周六&#xff09; #4场比赛2024-02-11…...

前端下载文件有哪些方式

前端下载文件有哪些方式 在前端&#xff0c;最常见和最常用的文件下载方式是&#xff1a; 使用 标签的 download 属性&#xff1a; 创建一个 标签&#xff0c;并设置其 href 属性为文件的 URL&#xff0c;然后使用 download 属性指定下载的文件名。 这种方式简单直接&…...

vscode预览github上的markdown效果

需要安装的插件有&#xff1a; Github Markdown Preview Markdown Checkboxes Markdown Emoji Markdown footnotes Markdown Preview Github Styling Markdown Preview Mermaid Support Markdown yaml Preamble ctrlshiftv结合双页功能...

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)。 要使用PaddleNLP和BERT来识别垃圾邮件并做中文邮件内容分类,可以按照以下步骤进行操作: 安装PaddlePaddle和PaddleNLP:首先,确保在你的环境中已经安装了PaddlePaddle和…...

在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)

最近要批量解压归档文件和压缩包&#xff0c;所以就想能不能并行执行这些工作。因为tar自身不支持并行解压&#xff0c;但是像make却可以支持生成一些文件&#xff0c;所以我才有了这种想法。 方法有两种&#xff0c;第一种不用安装任何软件或工具&#xff0c;直接bash或其他 …...

拼音笔记笔记

一、翀的读音&#xff1a;chōng 声母&#xff1a;ch 韵母&#xff1a;ong 声调&#xff1a;一声 二、汉字释义&#xff1a; 向上直飞&#xff0c;相当于“冲”。 三、汉字结构&#xff1a;左右结构 四、部首&#xff1a;羽 五、相关词组&#xff1a; 翀举&#xff1a;谓成仙升…...

13. Threejs案例-绘制3D文字

13. Threejs案例-绘制3D文字 实现效果 知识点 FontLoader 一个用于加载 JSON 格式的字体的类。 返回 font&#xff0c;返回值是表示字体的 Shape 类型的数组。 其内部使用 FileLoader 来加载文件。 构造器 FontLoader( manager : LoadingManager ) 参数类型描述managerLo…...

clickhouse清理日志。

参考Clickhouse&#xff1a;日志表占用大量磁盘空间怎么办&#xff1f;_clickhouse store目录很大-CSDN博客t 清理脚本如下&#xff0c;清理动作需要时间比较长&#xff0c;10多分钟&#xff1a; alter table system.trace_log delete where event_date < 2024-01-01 alt…...

JS中实现继承

1.使用call实现继承&#xff08;不推荐&#xff09; function Animal(name) {this.name name;this.run function() {console.log(this.name, "跑");} } function Dog(name) {// 继承Animal.call(this, name);this.sleep function() {console.log(this.name, &quo…...

spring boot学习第九篇:操作mongo的集合和集合中的数据

1、安装好了Mongodb 参考&#xff1a;ubuntu安装mongod、配置用户访问、添删改查-CSDN博客 2、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns…...

momentJs推导日历组件

实现效果: 代码&#xff1a; 引入momentjs然后封装两个函数构建出基本数据结构 import moment from moment;// 某月有多少天 export const getEndDay (m) > m.daysInMonth();/*** description 获取本月空值数据* param { Date } year { } 年度* param { Number } month …...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...