C语言05--指针初识

news2024/9/25 1:25:17

内存地址

  • 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte = 8bits
  • 地址:系统为了便于区分每一个字节而对它们逐一进行的编号,称为内存地址,简称地址。
  • 注:地址是按字节编号的,正常是十六进制编号,但是不管十六进制还是八进制还是二进制什么进制编号,加一都是加一个字节

基地址

  • 单字节数据:对于单字节数据而言,其地址就是其字节编号。
  • 多字节数据:对于多字节数据而言,其地址是其所有字节中编号最小的那个,称为基地址、入口地址。

取址符

  • 每个变量都是一块内存,都可以通过取址符 & 获取其地址
  • 例如:
int a = 100;
printf("整型变量 a 的地址是: %p\n", &a);

char c = 'x';
printf("字符变量 c 的地址是: %p\n", &c);

double f = 3.14;
printf("浮点变量 f 的地址是: %p\n", &f);
  • 注意:
    • 虽然不同的变量的尺寸是不同的,但是他们的地址的尺寸确实一样的。
    • 不同的地址虽然形式上看起来是一样的,但由于他们代表的内存尺寸和类型都不同,因此它们在逻辑上是严格区分的,根据指针的类型加以区分。
    • 地址的尺寸即系统寻址范围,即字长

指针基础

  • 指针的概念:
    • 地址。比如 &a 是一个地址,也是一个指针,&a 指向变量 a。
    • 指针是一个专门用于存储地址的变量,又称指针变量。
  • 指针的定义:
int    *p1; // 用于存储 int  型数据的地址,p1 被称为 int  型指针,或称整型指针
char   *p2; // 用于存储 char 型数据的地址,p2 被称为 char 型指针,或称字符指针
double *p3; // 用于存储double型数据的地址,p3 被称为 double 型指针

注意:

      • 以上指针p1 .p2 .p3 都是指针,因此他们都用于存储某一个数据的入口地址。
      • 地址的大小由系统的位数决定。
      • 指针的大小都是一样的。
      • 唯一的不同是他们存储的地址的类型有差异。
    • 指针的类型并不影响指针本身的大小,而是决定了如何解析指针中存储的内存的二进制编码
  • 指针的赋值:赋给指针的地址,类型需跟指针的类型相匹配。
int a = 100;
p1 = &a; // 将一个整型地址,赋值给整型指针p1

char c = 'x';
p2 = &c; // 将一个字符地址,赋值给字符指针p2

double f = 3.14;
p3 = &f; // 将一个浮点地址,赋值给浮点指针p3
  • 指针的索引:通过指针,取得其指向的目标
*p1 = 200; // 将 p1 指向的目标(即a)修改为200,等价于 a = 200;
*p2 = 'y'; // 将 p2 指向的目标(即c)修改为'y',等价于 c = 'y';
*p3 = 6.6; // 将 p3 指向的目标(即f)修改为6.6,等价于 f = 6.6;
  • 指针的尺寸
    • 指针尺寸指的是指针变量所占内存的字节数
    • 指针所占内存,指针用于存储内存地址因此取决于地址的长度,而地址的长度则取决于系统寻址范围,即字长(系统位数)
    • 结论:指针尺寸只跟系统的字长有关,跟具体的指针的类型无关

野指针

  • 概念:指向一块未知区域(或者已经释放的区域)的指针,被称为野指针。野指针是危险的。

  • 危害:
    1. 引用野指针,相当于访问了非法的内存,常常会导致段错误(segmentation fault)
    2. 引用野指针,可能会破坏系统的关键数据,导致系统崩溃等严重后果
  • 产生原因:
    1. 指针定义之后,未初始化,因此他的值是随机的
    2. 指针所指向的内存,被系统回收
    3. 指针越界
  • 如何防止:
    1. 指针定义时,及时初始化
    2. 绝不引用已被系统回收的内存
    3. 确认所申请的内存边界,谨防越界

空指针

很多情况下,我们不可避免地会遇到野指针,比如刚定义的指针无法立即为其分配一块恰当的内存,又或者指针所指向的内存被释放了等等。一般的做法就是将这些危险的野指针指向一块确定的内存,比如零地址内存。

  • 概念:空指针即保存了零地址的指针,亦即指向零地址的指针。
  • 示例:
// 1,刚定义的指针,让其指向零地址以确保安全:
char *p1 = NULL;
int  *p2 = NULL;

// 2,被释放了内存的指针,让其指向零地址以确保安全:
char *p3 = malloc(100); // a. 让 p3 指向一块大小为100个字节的内存
free(p3);               // b. 释放这块内存,此时 p3 相当于指向了一块非法内存
p3 = NULL;              // c. 让 p3 指向零地址

指针运算

  • 指针加法意味着地址向上(高)移动若干个目标
  • 指针减法意味着地址向下(低)移动若干个目标
    • 目标的单位大小取决于指针本身的类型,与他所指向的数据地址无关
  • 示例:
int  a = 100;
int *p = &a; // 指针 p 指向整型变量 a

int *k1 = p + 2; // 向上移动 2 个目标(2个int型数据)
int *k2 = p - 3; // 向下移动 3 个目标(3个int型数据)

由实验可以得出,指针的加减,只与指针本身的类型相关,如果指针是int 类型那么在加减的时候每+1或-1加减的是4个字节,如果指针的类型是 short 在加减的时候每+1或-1加减的是2个字节.

结语

        在本篇博客中,我们初步探索了指针的概念及其在编程中的重要性。指针作为一种强大的工具,能够直接操作内存地址,从而提高程序的灵活性与效率。通过理解指针的定义、基本操作以及实际应用场景,我们为日后的编程之旅打下了坚实的基础。

        掌握指针不仅能帮助我们更好地理解数据结构如链表和树,更能深入了解内存管理和优化程序性能。尽管指针的使用可能会增加一定的复杂性,但它们所带来的灵活性和强大功能,使得我们在编程中能够更加高效和有创意。

        希望你能在实践中继续探索指针的奥秘,并将所学知识应用于实际项目中。感谢你的阅读,期待在未来的博客中和你分享更多有趣的编程话题与技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多模态YOLOv8 融合可见光+红外光(RGB+IR)双输入【附代码】

文章目录 前言视频效果代码获取文章概述必要环境一、模型训练1、 定义数据1.1、数据集结构1.2、定义data.yaml 2、 运行方法运行效果 二、模型验证运行方法运行效果 三、模型推理1. 参数定义2. 运行方法运行效果 四、效果展示白天夜间 总结 前言 最近看不少朋友提到双模态YOLO…

基于SpringBoot的健康饮食管理系统---附源码98382

目 录 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程…

什么是营销自动化?营销自动化的优势?

在SaaS行业和软件行业中,营销自动化作为一种先进的营销手段,正逐渐受到企业的青睐。营销自动化基于大数据和人工智能技术,能够自动执行、管理和完成营销任务和流程,为企业带来诸多优势。 营销自动化是一种能够一体化执行、管理、…

SecretPixel:一款整合了多种技术的高级图像隐写工具

关于SecretPixel SecretPixel是一款先进的隐写术工具,旨在安全地隐藏图像中的敏感信息。它结合了先进的加密、压缩和种子最低有效位 (LSB) 技术,为隐藏数据提供了一种不可检测的强大解决方案,在数字隐写术领域脱颖而出。 功能介绍 1、高级加…

2024 Python3.10 系统入门+进阶(七):字符串及其常用操作详解上篇

目录 一、初始化二、索引三、常用操作3.1 拼接字符串3.1.1 ""号3.1.2 join()方法 3.2 检索字符串3.2.1 find() 方法——字符串首次出现的索引位置(rfind()、index()、rindex())3.2.2 count() 方法——统计字符串出现次数3.2.3 len() 函数——计算字符串长度或元素个数…

RabbitMQ的高可用

1.Rabbit集群 采用集群模式保护消息的完整。 1.1普通集群 在普通集群模式下,各个节点之间有相同的元数据,即队列结构,而消息不会冗余(不同节点的消息不同)。 消费时,如果消费的不是存有数据的节点&…

如何用Python进行民宿数据分析:一步步教你实现可视化

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

基于swifter多内核的加速Pandas DataFrame操作运行

swifter是提高pandas性能的第三方包,主要是apply函数。 接口支持范围: 运行环境和安装 操作系统是Win10 64,pandas版本是2.2.2,swifter版本是1.4.0。 pip安装 $ pip install -U pandas # upgrade pandas $ pip install swifter # first time installation $ pip inst…

Android 架构模式之 MVVM

Android 架构 Android 架构模式之 MVCAndroid 架构模式之 MVPAndroid 架构模式之 MVVM 目录 Android 架构架构设计的目的对 MVVM 的理解代码ModelViewViewModel Android 中 MVVM 的问题试吃个小李子BeanModelViewViewModel效果展示 大家好! 作为 Android 程序猿&a…

大数据ETL工具(Sqoop, DataX, Kettle)对比

文章目录 1. ETL简介2. Sqoop2.1 Sqoop简介2.2 Sqoop主要特点 3. DataX3.1 DataX简介3.2 DataX框架设计3.3 DataX的主要特点 4. Kettle4.1 Kettle简介4.2 Kettle的主要特点 5. 工具对比5.1 DataX 与 Sqoop对比5.2 DataX 与 Kettle 6. 总结 1. ETL简介 ETL(Extract-…

Mamba来搞图像增强了!高创新,发小论文不愁!

用Mamba做图像增强是个创新性比较高的方向,因为Mamba拥有非常独特的架构设计,能够同时捕获全局和局部的信息,轻松助力模型理解图像的整体结构和上下文,帮助我们确保图像细节的准确恢复和增强。 这种优势让它在保持高效计算的同时…

MySQL主从复制重新初始化单表或者单库的方法

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享…

【C++ Primer Plus习题】3.7

问题: 解答: #include <iostream> using namespace std;const float GALLO_TO_LITRE 3.785; const float KM_TO_MILE 62.14;int main() {float litre 0;float gallo 0;float mile 0;cout << "请输入汽车油耗(每100km消耗的汽油量单位为升):";cin &…

C#下在派生类中引发基类事件的方法与示例

文章目录 基类事件在派生类中的定义及触发方式基类事件的传播机制示例总结 在面向对象编程中&#xff0c;继承是代码复用的一种重要方式。C#作为一种面向对象的编程语言&#xff0c;允许派生类继承基类的属性和方法。基类定义了一系列共有的属性和行为&#xff0c;而派生类则可…

【UE】尝试一种老派的平面假反射做法,与进一步改进效果的思路

在实践中&#xff0c;常常需要为类似荧幕&#xff0c;LED广告牌等平面制作反射。 但会遇到各种问题&#xff0c;例如在使用屏幕空间反射时&#xff0c;平面必须在画面内 平面反射捕获与光线追踪又代价高昂 因此&#xff0c;在一些情况下依然会使用一种历史悠久的反射手法 这种…

树(二叉树)

树 1.1 特性 1.1.1 什么是树 树(Tree)是(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; (1) 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的有限集合T1、T2、……、Tm&#x…

【Docker】Linux系统以及威联通QNAP部署思源笔记的通用教程

本文首发于 ❄️慕雪的寒舍 本文测试的是旧版本v2.11.4的部署方式&#xff0c;实测当前&#xff08;2024.08.15&#xff09;最新的v3.1.3版本也可以用相同的方式部署。本文的部署方式共写了三种&#xff0c;非qnap的linux系统也可以参考本文部署思源笔记。 阅读本文之前&#…

SpringBoot 集成积木报表

SpringBoot 集成积 前言 积木报表是jeecg的一款开源但代码不开源的一款自定义报表&#xff0c;可以基于网页灵活 调整报表的布局、样式等内容&#xff0c;无需编程&#xff0c;专为企业数据分析、报表制作而设计&#xff1b; 降低管理人员汇总制作报表的门槛&#xff0c;解决…

在表格上,按照单元格数值显示单元格背景进度条

想要实现的效果如下&#xff1a; 单元格背景进度条的大小取决于当前单元格里的数值 TreeList和GridControl的设置方法都是相同的&#xff1a;都是通过给列设置FormatRule来实现的。 相关代码及设置如下&#xff1a; 1、给控件绑定数据源&#xff0c;我的数据源是一个DataTab…

25届网安秋招,信息泄露常问之配置信息泄露

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…