C语言——指针(五)
📝前言:
上篇文章C语言——指针(四)更加深入的介绍了不同类型指针的特点,这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法:
1,函数与指针
2,const
3,assert断言
🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:对待生命,你不妨大胆一点,因为我们最终要失去它
文章目录
- 一,函数与指针
- 1,指针变量作为函数参数
- 2,返回指针的函数
- 二,const
- 1,const 修饰变量
- 2,const 修饰指针变量
- 三,assert断言
- 1,assert的使用
- 2,assert的禁用
一,函数与指针
在上一篇文章中,我们提到了函数指针,函数指针是用来存放函数地址的指针,这篇文章,我们还将继续探究函数与指针。
1,指针变量作为函数参数
像int ,char类型一样,指针类型也可以作为函数的参数类型。
当我们使用指针类型作为函数的参数,实际向函数传递的是储存单元的地址。当我们改变该地址空间的数据后,尽管子程序调用结束,但是数据的改变情况也会被保留下来。
看下面这段代码👇🏻,利用swap函数能实现实参a和b的交换吗?
void swap(int x,int y)
{int t = x;x = y;y = t;
}
答案是:不能
因为这个函数在传值时:只是把a和b的值传递给了形参,但是形参只是实参的临时拷贝,形参之间值的交换,无法影响到实参,所以也完成不了交换
当我们利用指针变量作为函数参数👇🏻
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//实现交换:
void swap1(int* p1, int* p2)
{int t;t = *p1;*p1 = *p2; *p2 = t;
}
int main()
{int* pa, * pb, a = 3, b = 4;pa = &a;pb = &b;swap1(pa, pb); //调用函数,在函数内部交换printf("%d %d\n", a,b);return 0;
}
输出结果 👇🏻
我们发现🔍
a和b的值在函数内部被交换完以后,尽管函数调用结束,但是a和b是永久的交换了
这也就是传值和传址的区别:传值是对形参进行操作,但是传址是对实参的地址空间进行操作
2,返回指针的函数
我们把返回地址值(即返回指针值)的函数称之为指针函数,指针函数定义如下:
类型名* 函数名(参数);
如:int * fun(int x, int y);
表示fun是具有两个整型参数且返回整型指针的函数,返回的指针值指向一个整型数据。
使用实例:
返回两个数中大数的地址的函数:
int* fun(int* x, int* y)
{int* z;if (*x > *y)z = x;elsez = y;return z;
}
int main()
{int a, b, * p;scanf("%d %d", &a, &b);p = fun(&a, &b);//用p来接收所返回的地址printf("max = %d\n", *p);//打印p所指向的数据return 0;
}
运行程序(输入3 8)👇🏻
max = 8,如我们所愿:函数fun返回了b的地址,p接收的就是b的地址👍
二,const
C语言中提供了const关键字,其主要作用是:
限定声明的变量值为常量,在程序运行时值不能改动。
1,const 修饰变量
如下面的代码👇🏻
#include<stdio.h>
int main()
{int m = 0;m = 20; //这是我们正常的修改值的方式const int n = 0; //n有const修饰n = 20; //(错误)n无法修改return 0;
}
编译错误如下👇🏻
在上述代码中,n的本质还是变量,只不过被const修饰以后,在语法上加了限制,让我们不能直接修改n(这时,我们也称n为常变量)
2,const 修饰指针变量
下面有两种不同的修饰方式👇🏻
const int *p; //第一种也等效于(int const *p)
int* const p;//第二种
●第一种,右边离const最近的是*,修饰的是*,意思是:不能通过p来改变p指向的空间的内容
●第二种,右边离const最近的是p,修饰的是p,意思是:不能改变p变量本身的内容
如下面的代码👇🏻
int main()
{int n = 10;int m = 20;const int *pn = &n;*pn = 20; //(无法执行)p = &m; //(可以执行)return 0;
}
在上面的代码中
无法执行是因为:const修饰了*pn,所以pn所指向的内容无法修改
但是p = &m;
可以执行,因为p是变量本身,没有被限制,可以修改
再看下面的代码👇🏻
int n = 10
int m = 20;
int const * const p = &n;
如果这样写,const既修饰了*,又修饰了p,则:
*p = 20;
p = &m;
都无法执行
三,assert断言
assert.h头文件中定义了宏assert()
1,assert的使用
assert()用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行
如👇🏻
#include<stdio.h>
#include<assert.h>
int main()
{int* p1 = NULL;assert(p1 != NULL);return 0;
}
一旦我们运行👇🏻
上面的代码:assert(p1!=NULL); 发现表达式不符合条件,于是assert就会终止运行,并且给出错误信息的提示。
assert()
宏接受一个表达式作为参数:
●如果表达式为真(返回值非零),assert不会产生任何作用,程序继续执行。
●如果表达式为假(返回值为零),assert() 就会报错,在标准错误流stderr中写入一条错误信息,显示没有通过表达式(包含这个表达式的文件名和行号)
2,assert的禁用
上面谈到了用assert来检查程序,但是程序中使用assert会增加程序的运行时间。当程序没有问题,我们不需要assert的时候,只需在#include<assert.h>
的语句前面定义一个宏NDEBUG
例如👇🏻
#define NDEBUG
#include<assert.h>
这时候再编译程序,编译器就会禁用文件中所有的assert语句。
一般我们在Debug版本中使用assert,在Release中禁用assert
如:在vs这样的集成开发环境,Release版本中,是直接优化掉的;
但是在Linux的Release版本下,assert还起作用,需要我们自行禁用
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:

C语言——指针(五)
📝前言: 上篇文章C语言——指针(四)更加深入的介绍了不同类型指针的特点,这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法: 1,函数与指针 2,const 3&am…...

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》
这个标题涉及到一个涉及气体(天然气)和电力的综合能源配网系统,并且强调了考虑气电联合需求响应的协调优化运行。让我们逐步解读: 气电综合能源配网系统: 这指的是一个结合了气体(通常是天然气)…...
PostgreSQL 主键和唯一键的区别
主键和唯一键的区别 主键(Primary Key): 主键是用于唯一标识表中的每一条记录的键。主键必须是唯一的,不允许为空。一个表只能有一个主键。主键可以由一个或多个字段组成。主键的值在整个表中必须是唯一的,用于确保数据…...

删除表格中的所有绘图
Ctrl G 调出定位的对话框再点击定位条件 按Delete键,删除...
Linux卸载Nginx
1、停止Nginx软件 #/usr/local/nginx/sbin/nginx-sstop 或者kill进程 #ps -ef|grep nginx #kill -9 PID 2、查找根下所有名子包含nginx的文件 #sudofind/-namenginx* 3、执行命令删掉nignx安装的相关文件 # rm -rf /usr/local/sbin/nginx # rm -rf /usr/local/nginx # r…...

Qt之QGraphicsView —— 笔记1:绘制简单图元(附完整源码)
效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…...
SpringIoC原理
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...

如何对售后服务的全流程进行精细化的管理?
——“如何对售后服务的全流程进行精细化的管理?” ——“售后又是一个十分复杂的过程,仅靠手工或者电子表格记录这些内容,肯定是低效率、易出错的。最好的办法是借助合适的管理工具进行精细化的过程管理。” 假设你购买了一台新的家用电器…...

SAP UI5 walkthrough step2 Bootstrap
我的理解,这就是一个引导指令 1.我们右键打开命令行--执行 ui5 use OpenUI5 2.执行命令:ui5 add sap.ui.core sap.m themelib_sap_horizon 执行完之后,会更新 yaml 文件 3.修改index.html <!DOCTYPE html> <html> <head&…...

Gemini:定义下一代人工智能的里程碑
Google最近发布号称世界最强的大模型"Gemini",其强大多模态LLM,标志着AI技术的一个新时代。 Gemini作为"迄今为止最强大的AI模型"之一,其独特之处在于它融合了多种模式的处理能力,能够同时理解和生成文本、代…...

一些系统日常运维命令和语句
一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…...

微信小程序uni.chooseImage()无效解决方案
Bug场景: 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传,这里不再赘述具体参数。一直项目都可以正常使用,突然有一天发现无法使用该方法,于是查了一下,发现是用户隐私协议问题。故记录一下解决方案。…...
Rust深入浅出:编程的深邃大海中的奇妙冒险
第一章:前言 欢迎来到Rust的深邃大海,这里是一片充满挑战和奇妙冒险的领域。在这篇文章中,我们将深入浅出,探索Rust编程语言的深层次特性,并通过诙谐而深刻的方式,带你走进这个奇妙的编程世界。 第二章&a…...
go-zero开发入门-API网关开发示例
开发一个 API 网关,代理 https://blog.csdn.net/Aquester/article/details/134856271 中的 RPC 服务。 网关完整源代码 // file: main.go package mainimport ("flag""fmt""github.com/zeromicro/go-zero/core/conf""github.c…...

TCP一对一通信
package 二十一章; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** Socket服务端**/ public class SocketServer {public static void main(String[] args) {ServerSocket ss null;Socket s null;try {// 创建监听…...

laravel DB::connection 报错 Database connection [{$name}] not configured
DB::connection(mysql2);//不是连接数据库名...

快捷支付是什么?快捷支付好申请吗?
快捷支付是指用户在购买商品时,不需要打开网上银行,只需提供银行卡号码、户名、手机号码等信息,银行验证手机号码的正确性,输入动态密码即可完成支付,无需打开网上银行。持卡人将银行卡绑定到第三方支付应用程序&#…...

如何在Spring Boot中集成RabbitMQ
如何在Spring Boot中集成RabbitMQ 在现代微服务架构中,消息队列(如RabbitMQ)扮演了关键的角色,它不仅能够提供高效的消息传递机制,还能解耦服务间的通信。本文将介绍如何在Spring Boot项目中集成RabbitMQ,…...

【Spring Boot 源码学习】ApplicationContextInitializer 详解
Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》,我们…...

软考2018下午第六题改编逻辑(状态模式)
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...