深入理解c指针(四)

目录

六、assert断言

七、指针的使用和传址调用

1、strlen的模拟实现

2、传值调用和传址调用

3、练习-字符串逆序 


在深入理解c指针(三)提到,在实际使用指针前可以检测其是否指到有效空间:

#include<stdio.h>
int main()
{int a = 10;int* p = &a;//...//...p = NIULL;//...//...if (p != NULL){//...}return 0;
}

六、assert断言

       assert.h 头文件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报
错终止运行。这个宏常常被称为“断言”。

        下面代码当程序运行到这一行语句时,验证变量 p 是否等于 NULL 。如果确实不等于NULL,程序继续运行。否则结果为假就会终止运行,并且给出报错信息提示。甚至提示在哪个路径下哪个文件的哪一行出现错误。

#include<stdio.h>
#include<assert.h>
int main()
{int a = 10;int* p = &a;//...//...p = NULL;assert(p != NULL);return 0;
}

      assert()的使用对程序员是非常友好的,使用assert()有几个好处:它不仅能自动标识文件和出问题的行号,还有一种无需更改代码就能开启和关闭assert()的机制。

      如果已经确认程序没有问题,不需要再做断言,就在 #include<assert.h> 语句的前面,定义一个宏 NDEBUG,然后重新编译程序,编译器就会禁用文件中所有的assert()语句。如果程序又出现问题,可以移除#define NDEBUG 指令(或者注释掉),再次编译,再次编译这样就重新启用了assert()语句。  

#define NDEBUG
#include <assert.h>
#include <stdio.h>
int main()
{int a = 10;int* p = &a;//...//...p = NULL;assert(p != NULL);return 0;
}

七、指针的使用和传址调用

1、strlen的模拟实现

2、传值调用和传址调用

#include <stdio.h>
void Swap1(int x, int y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n", a, b);Swap1(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

发现其实没产生交换的效果,我们发现在main函数内部,创建了 a 和 b,a 的地址是0x00cffdd0,b 的地址是0x00cffdc4,在调用Swap1函数时,将 a 和 b 传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y确实接收到了a和b的值,不过x的地址和a的地址不⼀样,y的地址和b的地址不⼀样,相当于x和y是独立的空间,那么在Swap1函数内部交换x和y的值,自然不会影响 a 和 b,当Swap1函数调用结束后回到main函数,a 和 b 的没法交换。Swap1函数在使用的时候,是把变量本身直接传递给了函数,这种调用函数的方式我们之前在函数的时候就知道了,这种叫传值调用

结论:实参传递给形参时,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。


         我们现在要解决的就是当调用Swap函数的时候,Swap函数内部操作的就是main函数中的a和b,直接将 a 和 b 的值交换了。那么就可以使用指针了,在main函数中将 a 和 b 的地址传递给Swap函数,Swap函数里边通过地址间接的操作main函数中的 a 和 b,并达到交换的效果就好了。

 

3、练习-字符串逆序 
#include<stdio.h>
#include<string.h>
void Reverse(char* str)
{char* left = str;char* right = str + strlen(str)-1;while(left < right){char temp = *left;*left = *right;*right = temp;++left;--right;}
}int main()
{char str[] = "hello bit";Reverse(str);return 0;
}// 注意:如果是在线OJ时,必须要考虑循环输入,因为每个算法可能有多组测试用例进行验证,参考以下main函数写法,
int main()
{char str[101] = {0};while(gets(str)){Reverse(str);printf("%s\n", str);memset(str, 0, sizeof(str)/sizeof(str[0]));}return 0;
}

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

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

相关文章

度量与评估客户体验:以客户为中心的方法和工具

在当今的市场环境中&#xff0c;客户体验已经成为企业成功的关键因素。一个优秀的客户体验不仅能够提升客户满意度&#xff0c;增强客户忠诚度&#xff0c;还能够吸引新的潜在客户。然而&#xff0c;要实现这一目标&#xff0c;企业首先需要了解如何度量和评估客户体验。本文将…

day08_分类品牌管理商品规格管理商品管理

文章目录 1 分类品牌管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 品牌列表加载1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端对接brand.jscategoryBrand.vue 1.5 分类数据加载1.6 列表查询1.6.1 需求说明1.6.2 后端接口需求分析Categor…

linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)

当我写了如下汇编时 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…

Python进阶教学一

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、函数1.高阶函数2.返回函数3.匿名函数4.装饰器 二、实例1.类和实例2.限制访问3. 继承和多态4.实例属性和类属性 一、函数 1.高阶函数 1.1 map1.2 reduce1.3 fi…

Dsco Dropship EDI需求分析

供应商要想从Dsco处通过EDI获取订单&#xff0c;需要部署自己的EDI系统&#xff0c;与Dsco的EDI供应商CommerceHub 建立连接&#xff0c;分为两个方向&#xff1a; 1.从CommerceHub 的 Dsco 平台获取 EDI 850 采购订单 2.向Dsco发送库存&#xff08;846&#xff09;、订单状态…

MySQL的内外连接

1.内连接 内连接实际上就是利用 WHERE 子句&#xff08;连接条件&#xff09;对两张表形成的笛卡尔积&#xff08;内连接&#xff09;进行筛选&#xff0c;我们之前学习的查询基本都是内连接&#xff0c;也是在实际生产中被使用得最多的连接查询。 另外内连接还可以使用下面的…

Java Swing游戏开发学习7

内容来自RyiSnow视频讲解 这一节实现的是背景音乐和音效的播放。 在这里&#xff0c;背景音乐和音效所用的音频文件均为wav格式文件。Java SDK默认支持的格式有限&#xff0c;默认不支持mp3格式音乐。 背景音乐、拾取钥匙、拾取靴子、开门分别有对应的音频文件。 作者的实现…

2024-02学习笔记

1.当我们向Set集合中添加一个已经存在的元素时 当我们向Set集合中添加一个已经存在的元素时&#xff0c;Set集合会如何处理呢&#xff1f;实际上&#xff0c;Set集合不会将重复的元素添加到集合中。当我们向Set集合中添加一个元素时&#xff0c;Set集合会首先判断该元素是否已…

Ubuntu-22.04安装MegaCLI并查看MegaRAID的配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MegaRAID二、安装MegaCLI1.Ubuntu-18.042.Ubuntu-22.043.Ubuntu-20.044.CentOS-75.其它发行版 三、使用MegaCLI1.查看所有适配器信息2.查看所有物理磁盘信息…

华为配置WLAN高密业务示例

配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大&#xff0c;AP间部署距离较小&#xff0c;因此AP间的干扰较大&#xff0c;可能导致用户上网网…

新王炸:文生视频Sora模型发布,能否引爆AI芯片热潮

前言 前方高能预警&#xff0c;Sora来袭&#xff01; 浅析Sora的技术亮点 语言模型中构建关键词联系 视频素材分解为时空碎片 扩散模型DiT Not for play, But change world! OpenAI的宏大目标 未来已来&#xff0c;只是尚未流行 Sora的成本与OpenAI的7万亿美金豪赌 算…

【探索AI】人人都在讲AIGC,什么是AIGC?

AIGC 概述示例展示我们日常用到的一些工具/应用核心技术介绍核心技术的算法解析案例及部分代码实现1. 艺术作品2. 设计项目3. 影视特效4. 广告创意总结 一张图先了解下&#xff1a; 概述 "人工智能生成创造&#xff08;Artificial Intelligence Generated Content&#x…

从CPU缓存结构到原子操作

一、CPU缓存结构 1.1 CPU的多级缓存 因为CPU的计算速度非常快&#xff0c;但内存的访问速度相对较慢。因此&#xff0c;如果CPU每次都要从内存读取数据&#xff0c;会造成大量的等待时间&#xff0c;降低整体性能。 通过引入多级缓存&#xff0c;可以在CPU和内存之间建立数据…

vue3中实现elementPlus表格选中行的上移下移

先看效果&#xff1a; 实现步骤&#xff1a; 1、给el-table添加current-change事件、高亮属性及ref属性 2、给上移下移按钮添加事件 // 定义当前选中的行参数 const currentRow ref<any>(null); // 定义表格的ref const singleTableRef ref(); // 行选中事件 const ha…

正信晟锦:借了钱的人一直不接电话不回信息咋办

在金钱往来中&#xff0c;遇到借出的钱款无法按时回收&#xff0c;且借款人如同人间蒸发一般不接电话、不回信息&#xff0c;确实让人焦虑。面对这种情形&#xff0c;我们需采取明智而有效的措施&#xff0c;以保护自身的权益。 首要策略是保持冷静&#xff0c;不要让情绪主导行…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…

【前端素材】推荐优质在线高端蜂蜜商城电商网页Beejar平台模板(附源码)

一、需求分析 1、系统定义 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台。这种商城致力于向消费者提供各种经过精心挑选、具有高营养价值和健康功效的蜂蜜产品。 2、功能需求 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台…

Go字符串实战操作大全!

目录 1. 引言文章结构概览 2. Go字符串基础字符串的定义与特性什么是字符串&#xff1f;Go字符串的不可变性原则 字符串的数据结构Go字符串的内部表达byte和rune的简介 3. 字符串操作与应用3.1 操作与应用字符串连接字符串切片字符串查找字符串比较字符串的替换字符串的大小写转…

vos3000外呼系统警告消除怎么设置

你有没有发现vos3000登陆时老是提示告警&#xff0c;消除一会又出现&#xff0c;那么又什么办法能解决呢&#xff1f;要彻底消除 VOS3000 系统的警告&#xff0c;一般需要通过以下步骤来进行排查和解决&#xff1a; 确认警告信息&#xff1a;首先要明确警告的具体内容和出现的条…

旧的Spring Security OAuth已停止维护,全面拥抱最新解决方案Spring SAS

Spring Authorization Server 替换 Shiro 指引 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用作为 SpringBoot 3.0 的最新…