突破•指针二

听说这是目录哦

  • 复习review❤️
  • 野指针🫧
  • assert断言🫧
    • assert的神奇之处
  • 指针的使用和传址调用🫧
  • 数组名的理解🫧
    • 理解整个数组和数组首元素地址的区别
  • 使用指针访问数组🫧
  • 一维数组传参的本质🫧
  • 二级指针🫧
  • 能量站😚

复习review❤️

内存单元的编号 == 地址 == 指针
指针变量是存放地址的变量,日常所说的指针一般是指针变量。

野指针🫧

野指针就是指向的位置无法被正确找到的指针变量。
野指针的成因:

  1. 指针变量未初始化(会被系统随机分配一个值,不是自己想要的)
  2. 指针变量越界访问
  3. 指针变量指向的空间已释放

避免野指针:

  1. 指针变量初始化【如果不知道指向哪,就赋值给NULL。NULL的值是0,0也是地址,但这个地址无法被访问,读取(解引用*)时会报错。所以使用指针前应判断它是否为NULL。】
  2. 小心指针越界
  3. 指针变量不再使用时,及时置NULL,指针使用前检查有效性【防止指向已释放的空间。一个约定俗成的规则:只要是NULL 指针就不去访问。】
  4. 避免返回局部变量的地址【防止指向已释放的空间,因为局部变量的地址在使用完后就会被释放。局部变量存储在函数栈区,当程序调用结束后,在函数栈区的所有东西将会由计算机进行销毁。】

assert断言🫧

assert(正确的条件)是一个宏,常被称为“断言”,使用要加头文件assert.h
作用:在运行时确保程序符合指定条件。如果符合,它不会产生任何影响;如果不符合,就报错终止运行。

如果符合,就像:
pa确实不为NULL,正确,继续执行。
在这里插入图片描述
在这里插入图片描述

如果不符合,就像:
不符合断言的条件pa == NULL,报错,终止执行。
在这里插入图片描述
报错会显示assert所在行号以及错误原因。
在这里插入图片描述

由上可知,符合assert()括号内的才会继续执行。

assert的作用是排查代码错误。
assert的缺点是它作为额外的检查,会增加程序运行的时间。
assert只能在Debug版本中使用,因为在Release版本中会被直接优化掉。

assert的神奇之处

它有一种无需更改代码就能开启或关闭assert()的机制。
如果已经确认程序没有问题,不需要再做断言,就在#include<assert.h>前定义一个宏NDEBUG。如果需要再使用assert(),可以把#define NDEBUG注释或删掉。
在这里插入图片描述

指针的使用和传址调用🫧

实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实参。即形参与实参只是值相同,但地址不同。
实参是被传过去的,形参是用来接收的。
传值调用:无法在被调用函数中改变主调函数中的变量值。
传址调用:可以在被调用函数中改变主调函数中的变量值。
在这里插入图片描述

数组名的理解🫧

数组名就是数组首元素(第一个元素)的地址,但有两种情况例外:

  1. sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素
    的地址是有区别的)。

理解整个数组和数组首元素地址的区别

在这里插入图片描述

输出结果:
在这里插入图片描述
这里涉及十六进制转化为十进制的计算,我们先不做讨论,主要理解指针。

这里我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是首元素的地址,+1就是跳过一个元素。

但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。
在这里插入图片描述

使用指针访问数组🫧

arr[i] == *(arr+i) == *(i+arr) == i[arr]
知道它们等价就好,不提倡装这个逼啊🙅‍♀️。
数组方式用arr[i]
指针方式用*(arr+i)

一维数组传参的本质🫧

不可以把数组传给一个函数后,在函数内部求数组的元素个数哦。因为本质上数组传参传递的是数组首元素的地址。

#include <stdio.h>void test(int arr[])
{int sz2 = sizeof(arr) / sizeof(arr[0]); printf("sz2 = %d\n", sz2);
}int main() 
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz1 = sizeof(arr) / sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);//首元素的地址除以首元素的地址return 0;
}

运行结果:
在这里插入图片描述
void test(int arr[])也可以写成void test(int* arr),即一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

二级指针🫧

指针变量也是变量,是变量就有地址。
一级指针*p的地址存放在二级指针**pp中,二级指针**pp的地址存放在三级指针***ppp中,以此类推。
一级指针的类型是int*,二级指针的类型是int**,三级指针的类型是int***,以此类推。

int a = 10;
int* p = &a;
int** pp = &p;
int*** ppp = &pp;
...

二级指针的应用:

#include <stdio.h>int main() 
{int a = 10;int* p = &a;int** pp = &p;**pp = 20;printf("%d\n", a);return 0;
}

运行结果:
**pp先通过*pp找到p,然后对p进行解引用操作:*p,找到a
在这里插入图片描述
可以把这一级级指针看成是抽屉,里面放着钥匙🗝️,解引用就是拿到钥匙开锁🔓的过程。
理解二级指针的两个*
在这里插入图片描述
可类推,如:
在这里插入图片描述

能量站😚

别赶路,去感受路。
请添加图片描述

❤️❤️❤️ 恭喜! 恭喜! 闯关成功! ❤️❤️❤️

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

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

相关文章

2-41 基于matlab的小车倒立摆系统的控制及GUI动画演示

基于matlab的小车倒立摆系统的控制及GUI动画演示。输入小车及倒立摆的初始参数&#xff0c;位置参数&#xff0c;对仿真时间和步长进行设置&#xff0c;通过LQR计算K值&#xff0c;进行角度、角速度、位置、速度仿真及曲线输出&#xff0c;程序已调通&#xff0c;可直接运行。 …

Linux设置开机启动Nginx

设置开机启动项 systemctl enable nginx 这个命令会创建一个符号链接到/etc/systemd/system/目录下的multi-user.target.wants/目录&#xff0c;从而确保Nginx在系统启动时自动运行。 查看Nginx是否已设置开机启动项 systemctl list-unit-files | grep nginx 删除开机启动 …

数据无忧:2024年高效硬盘数据恢复解决方法

在这个数字化时代&#xff0c;数据已成为我们生活与工作中不可或缺的一部分。手机或者电脑不够存储数据的时候我们最常用的就是采购硬盘来存储。以备不时之需我们来学习一下硬盘数据恢复的一些技巧吧。 1.福、昕数据恢复 这工具是一款简单小巧的数据恢复工具。下载安装在一分…

文心一言 VS 讯飞星火 VS chatgpt (307)-- 算法导论22.2 5题

五、证明&#xff1a;在广度优先搜索算法里&#xff0c;赋给结点 u 的 u.d 值与结点在邻接链表里出现的次序无关。使用图 22-3 作为例子&#xff0c;证明&#xff1a;BFS 所计算出的广度优先树可以因邻接链表中的次序不同而不同。如果要写代码&#xff0c;请用go语言。 文心一…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图&#xff1a;STC8H8K64URA8889开发板&#xff0c;使用P2口I2C接口&#xff1a; 2.实物连…

【python基础】类的继承、类导入、类的编写规范

文章目录 一. 继承1. 子类的方法__init__()2. 子类特有的属性和方法3. 重写父类的方法4. 类关系之引入&#xff1a;将实例用作属性 二. 导入类1. 导入类2. 在一个模块中导入另一个模块3. 使用别名导入并创建实例 三. Python标准库四. 类编码风格 一. 继承 一个类继承另一个类时…

log4j2启动异步日志与动态修改日志级别

启动异步日志 启用 Log4j2 的异步日志记录功能可以显著提升日志记录的性能&#xff0c;尤其是在高并发的环境下。异步日志记录通过将日志事件放入队列中进行处理&#xff0c;从而减少了日志记录对应用程序性能的影响。以下是如何启用 Log4j2 异步日志记录的详细步骤。 1. 添加…

【Python】写一篇setattr方法的使用博客

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 &#x1f3b5; 陈慧娴《情意结》 在 Python 中&#xff0c;动态地操作对象的属性是…

Oracle(15)什么是索引(Index)?

索引&#xff08;Index&#xff09;是数据库中一种用于提高查询性能的数据结构。索引在数据库表的一个或多个列上创建&#xff0c;类似于书的目录&#xff0c;通过索引可以快速定位和检索表中的数据行&#xff0c;而无需扫描整个表。尽管索引可以大幅提升查询性能&#xff0c;但…

2024 年 100 大数据科学面试问答

2024 年 100 大数据科学面试问答 一、说明 数据科学是一个快速发展的领域&#xff0c;它正在改变组织根据数据理解和做出决策的方式。因此&#xff0c;公司越来越多地寻求聘请数据科学家来帮助他们理解数据并推动业务成果。这导致了对数据科学家的高需求&#xff0c;这些职位的…

LeetCode 热题 HOT 100 (004/100)【宇宙最简单版】

【单调栈】No. 0739 每日温度 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; ⭐ 题目描述&#xff1a;给定一个整数数组 temperatu…

《Windows API每日一练》13.1 打印基础

在Windows中使用打印机时&#xff0c;在调用一系列与打印相关的GDI绘图函数的背后&#xff0c;实际上启动了一系列模块之间复杂的交互过程&#xff0c;包括 GDI32库模块、打印机设备驱动程序库模块&#xff08;带.DRV后缀的文件&#xff09;、Windows后台打印处理程序&#xff…

rem 和 px 的关系

在网页设计中&#xff0c;rem 和 px 是用来表示长度或尺寸的单位&#xff0c;它们之间有以下默认关系&#xff1a; 1rem 16px&#xff08;假设根元素的字体大小为默认值&#xff09; 详细说明&#xff1a; 1、px&#xff08;像素&#xff09;&#xff1a; px 是一种绝对单…

【图像处理】不智能的目标识别

目录 目标识别的划分 识别入门 概念学习 滤波 模版 阈值化 形态学操作 开运算 闭运算 编程语言 示例 大家有没有想过在没有人工智能或者说没有机器学习的的时候&#xff0c;计算机是怎么做目标识别的&#xff1f; 计算机视觉时至今日也是急需人才的领域&…

(AAAI,2024)Structure-CLIP:利用场景知识图谱增强多模态结构化表征

文章目录 Structure-CLIP: Towards Scene Graph Knowledge to Enhance Multi-modal Structured Representations相关资料摘要引言方法通过场景图进行语义负采样场景图生成选择语义负样本对比学习目标知识增强编码器 Structure-CLIP: Towards Scene Graph Knowledge to Enhance …

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方…

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 [外链图片转存失败,源站可能有防盗链…

数据库使用笔记-基于mysql

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 MySql 一般信息观前提示登录 MySQLSQL 语句 数据库操作指令show databases | 现实数据库列表u…

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应 以管理员身份运行 Anaconda Prompt conda update -n root conda conda update --all如果执行完以上步骤 碰到 AttributeError: module ‘pkgutil’ has no attribute ‘ImpImporter’. Did you mean: ‘zipimporter…

HC-SR04超声波测距模块使用方法和例程(STM32快速移植)

基于STM32和HC-SR04模块实现超声波测距功能 HC-SR04硬件概述HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器&#xff0c;将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们&#xff0c;它将产生一个输出脉冲&#xff0c;其宽度可用于…