突破•指针二

news2024/9/22 7:40:34

听说这是目录哦

  • 复习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.coloradmin.cn/o/1940046.html

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

相关文章

mq基础入门

前言 黑马商城导入了mq依赖 但是没有改service发消息 因为下单业务一直有问题 所以先没改 作业时间不够也没处理 1.异步调用 就是所谓的发短信 可以不用立即恢复 比如下单业务 下了单更新信息 就相当于发个消息通知一下 不用立即更改 但是支付就比较重要 不需要因为故障导…

数据结构——队列(顺序结构)

一、队列的定义 队列是一种线性数据结构,具有先进先出(FIFO)的特性。它可以理解为排队的队伍,先到先得,后到后得。队列有两个基本操作:入队(enqueue)和出队(dequeue)。入队在队列的末尾插入新元素,出队则是从队列的头部移除元素。这种数据结构常用于需要按照顺序处…

C语言中的运算符(二)

文章目录 &#x1f34a;自我介绍&#x1f34a;位运算符&#x1f34a;赋值复合运算符&#x1f34a;逗号运算符和赋值运算符&#x1f34a;运算符优先级 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ …

Qt开发网络嗅探器03

数据包分析 想要知道如何解析IP数据包&#xff0c;就要知道不同的IP数据包的包头结构&#xff0c;于是我们上⽹查查资料&#xff1a; 以太网数据包 ARP数据包 IPv4 IPv6 TCP UDP ICMP ICMPv6 根据以上数据包头结构&#xff0c;我们就有了我们的protocol.h文件&#xff0c;声明…

HTML+CSS+JS精美气泡提示框

源代码在效果图后面 点赞❤️关注&#x1f49b;收藏⭐️ 主要实现&#xff1a;提示框出现和消失两种丝滑动画 弹出气泡提示框后延迟2秒自动消失 效果图 错误框 正确 警告 提示 源代码 <!DOCTYPE html> <html lang"en"> <head><meta cha…

聚焦IOC容器刷新环节prepareBeanFactory专项

目录 一、IOC容器的刷新环节快速回顾 二、prepareBeanFactory源码展示分析 三、设置基本属性深入分析 &#xff08;一&#xff09;设置类加载器 &#xff08;二&#xff09;设置表达式解析器 &#xff08;三&#xff09;设置属性编辑器 &#xff08;四&#xff09;设计目…

快速排序、快速选择算法、找最近公共祖先

快速排序&#xff08;用i和j双指针&#xff0c;左部分值小&#xff0c;当ij时&#xff0c;两部分按基准值已经排序好&#xff0c;将基准值放到j即可。 class Solution {public int[] sortArray(int[] nums) {sort(nums,0,nums.length-1);return nums;}void sort(int[] nums,int…

初阶数据结构的实现1 顺序表和链表

顺序表和链表 1.线性表1.1顺序表1.1.1静态顺序表&#xff08;不去实现&#xff09;1.1.2动态顺序表1.1.2.1 定义程序目标1.1.2.2 设计程序1.1.2.3编写代码1.1.2.3测试和调试代码 1.1.2 顺序表的问题与思考 1.2链表1.2.1链表的概念及结构1.2.1.1 定义程序目标1.2.1.2 设计程序1.…

51单片机嵌入式开发:15、STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒

STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒 1 概述2 蜂鸣器操作方法3 蜂鸣器发出音声4 硬件电路5 软件实现6 整体工程&#xff1a;7 总结 1 概述 要实现一个基于STC89C52RC单片机的音乐盒&#xff0c;可以按照以下步骤进行&#xff1a; &#xff08;1&#xff09;硬…

Golang | Leetcode Golang题解之第274题H指数

题目&#xff1a; 题解&#xff1a; func hIndex(citations []int) int {// 答案最多只能到数组长度left,right:0,len(citations)var mid intfor left<right{// 1 防止死循环mid(leftright1)>>1cnt:0for _,v:range citations{if v>mid{cnt}}if cnt>mid{// 要找…

ISO 14001:企业环境管理的黄金标准

在全球可持续发展潮流中&#xff0c;企业的环境责任愈发重要。ISO 14001环境管理体系&#xff0c;为各类企业提供了一条优化环境绩效的明路。无论企业规模大小&#xff0c;业务类型如何&#xff0c;ISO 14001都能帮助企业有效管理环境影响&#xff0c;实现绿色发展。 ISO 14001…

QT样式美化 之 qss入门

样例一 *{font-size:13px;color:white;font-family:"宋体"; }CallWidget QLineEdit#telEdt {font-size:24px;}QMainWindow,QDialog{background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #1B2534, stop: 0.4 #010101,stop: 0.5 #000101, stop: 1.0 #1F2B…

【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

LeetCode 代码随想录跟练 Day17 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的…

PyCharm创建一个空的python项目

1.设置项目路径 2.配置python解释器 右下角可以选择always

提交(git-add git-commit git-push)

当修改好一个功能的时候&#xff0c;可以提交到远程仓库&#xff0c;这样就等于更新了一次版本&#xff0c;那么下次改修了文件的话&#xff0c;是跟这个版本做对比的 git status&#xff0c; 查看文件修改情况&#xff0c;git add 假如你只想提交1个文件&#xff0c;那么直接…

Python入门基础教程(非常详细)

现在找工作真的越来越难了&#xff01;今年更是难上加难 前几天在网上刷到这样一条热搜&#xff1a; #23岁找工作因年龄大被HR拒绝了# 是这个世界疯了还是我疯了&#xff1f; 合着只想要有20年以上工作经验的应届毕业生是吧 这好像就是现在的就业市场现状&#xff1a;“35岁…

【leetcode】二分查找本质

标题&#xff1a;【leetcode】二分查找本质 水墨不写bug 正文开始&#xff1a;&#xff08;点击题目标题转跳到OJ&#xff09; 目录 &#xff08;O&#xff09;前言* &#xff08;一&#xff09; 在排序数组中查找元素的第一个和最后一个位置 思路详解&#xff1a; 参考代…

cocos2d-x安装和项目

首先多方查找资料发现教程很简洁&#xff0c;发现对自己的操作方面没多大帮助&#xff0c;后来干脆去官网&#xff0c;好像也很简洁。基于这样一个原因&#xff0c;加上我首次碰cocos2d-x&#xff0c;决定记录一下整个流程&#xff0c;解决实际操作上的疑惑。 涉及的方面&…

数模·时间序列

时间序列思维导图 时间序列分析的方法 聚焦于趋势和季节变化 时间序列预测模型 时间序列平稳性 时间序列的平稳性是时间序列分析中的一个重要概念。一个时间序列如果是平稳的&#xff0c;意味着其统计性质&#xff08;如均值、方差、自相关等&#xff09;不随时间变化。 平稳性…

[计网04] 传输层和应用层 笔记 总结 万字详解

目录 传输层概述和功能 URL 和URI 端口号划分 套接字Socket UDP&#xff08;User Datagram Protocol&#xff09; UDP首部 UDP伪首部 TCP 三报文握手和四报文挥手 TCP&#xff08;Transmission Control Protocol&#xff09; TCP首部报文格式 TCP流量控制 cwnd&…