突破•指针二

听说这是目录哦

  • 复习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
在这里插入图片描述
可以把这一级级指针看成是抽屉,里面放着钥匙🗝️,解引用就是拿到钥匙开锁🔓的过程。
理解二级指针的两个*
在这里插入图片描述
可类推,如:
在这里插入图片描述

能量站😚

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

filebeat,kafka,clickhouse,ClickVisual搭建轻量级日志平台

springboot集成链路追踪 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from…

python—爬虫爬取电影页面实例

下面是一个简单的爬虫实例&#xff0c;使用Python的requests库来发送HTTP请求&#xff0c;并使用lxml库来解析HTML页面内容。这个爬虫的目标是抓取一个电影网站&#xff0c;并提取每部电影的主义部分。 首先&#xff0c;确保你已经安装了requests和lxml库。如果没有安装&#x…

HTML零基础自学笔记(上)-7.18

HTML零基础自学笔记&#xff08;上&#xff09; 参考&#xff1a;pink老师一、HTML, Javascript, CSS的关系是什么?二、什么是HTML?1、网页&#xff0c;网站的概念2、THML的基本概念3、THML的骨架标签/基本结构标签 三、HTML标签1、THML标签介绍2、常用标签图像标签&#xff…

数据结构----算法复杂度

1.数据结构前言 数据是杂乱无章的&#xff0c;我们要借助结构将数据管理起来 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所…

ranger审计日志对接CDH solr

作者&#xff1a;耀灵 一、准备条件 1、已安装完毕ranger-admin 2、已在CDH上部署solr&#xff08;注意在安装solr时更改下solr在zk上的节点信息&#xff09; 二、更改相关配置 1、修改ranger-2.1.0-admin/contrib/solr_for_audit_setup/install.properties SOLR_USERsolr …

科研绘图系列:R语言单细胞聚类气泡图(single cell bubble)

介绍 单细胞的标记基因气泡图是一种用于展示单细胞数据中特定基因表达情况的可视化方法。它通常用于展示细胞亚群中标记基因的表达水平,帮助研究者识别和区分不同的细胞类型。在这种图表中,每个细胞亚群用不同的颜色表示,而基因表达水平则通过气泡的大小来表示,从而直观地…

嵌入式C++、FreeRTOS、MySQL、Spring Boot和MQTT协议:智能零售系统详细流程介绍(代码示例)

项目概述 随着科技的发展&#xff0c;零售行业正经历着一场数字化转型。智能零售系统通过集成嵌入式技术和大数据分析&#xff0c;为商家提供了高效的运营管理工具。该系统的核心目标是提升顾客体验、优化库存管理、降低运营成本以及实现精准营销。 本项目将结合多种技术栈&a…

tree组件实现折叠与展开功能(方式1 - expandedTree计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察响应式对象列表封装和computed计算属性的使用&#xff0c;以及数组reduce方法实现结构化树拍平处理的核心逻辑。 实现思路 第一种方式&#xff1a;每次折叠或展开后触发…

【LeetCode】对称二叉树

目录 一、题目二、解法完整代码 一、题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#…

洗地机哪个牌子好性价比高又实惠?四款洗地机好洗地机的品牌推荐

在追求家居清洁效率与成本效益并重的今天&#xff0c;选择一款性价比高且实惠的洗地机显得尤为重要。市场上洗地机品牌琳琅满目&#xff0c;至于洗地机哪个牌子好性价比高又实惠成为很多人心中的疑问。为此&#xff0c;我们精心搜集并推荐四款洗地机好洗地机的品牌&#xff0c;…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(七)-广播远程识别码(Broadcast Remote ID)

目录 引言 5.5 广播远程识别码&#xff08;Broadcast Remote ID&#xff09; 5.5.1 使用PC5的广播远程识别码 5.5.2 使用MBS的广播远程识别码 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及…

达梦数据库DM8-索引篇

目录 一、前景二、名词三、语法1、命令方式创建索引1.1 创建索引空间1.2.1 创建普通索引并指定索引数据空间1.2.2 另一种没验证&#xff0c;官方写法1.3 复合索引1.4 唯一索引1.5 位图索引1.6 函数索引 2、创建表时候创建索引3、可视化方式创建索引3.1 打开DM管理工具3.2 找到要…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

利用request + BeautifulSoup 模块批量爬取内容,实现批量获取书名对应的豆瓣评分

文章目录 代码代码解释控制台输出结果 代码 #-*- coding:utf-8 -*- from bs4 import BeautifulSoup import requests, time, jsonheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.39…

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂&#xff0c;却蕴含一定的通用规律&#xff0c;正是为了简化这些通用化的工作&#xff0c;游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎&#xff0c;通过统一的界面支持创建2D和3D游戏。…

jmeter-beanshell学习11-从文件获取指定数据

参数文件里的参数可能过段时间就不能用了&#xff0c;需要用新的参数。如果有多个交易&#xff0c;读不同的参数文件&#xff0c;但是数据还是一套&#xff0c;就要改多个参数文件。或者只想执行参数文件的某一行数据&#xff0c;又不想调整参数文件顺序。 第一个问题目前想到…

Transformer 翻译

Attention Is All You Need Ashish Vaswani∗ Google Brain avaswanigoogle.com Noam Shazeer∗ Google Brain noamgoogle.com Niki Parmar∗ Google Research nikipgoogle.com Jakob Uszkoreit∗ Google Research uszgoogle.com Llion Jones∗ Google Research lliongoogle.c…

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;

力扣最热一百题——2.字母异位词分组

目录 题目链接&#xff1a;49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 题目 示例 提示 解法一&#xff1a;哈希表排序 思路 代码实现 解法二&#xff1a;记录字母出现的次数哈希表 思路 代码实现 总结 话不多说直接上题目。 题目链接&#xff1a;…