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还起作用,需要我们自行禁用

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

3.PyTorch——常用神经网络层

import numpy as np import pandas as pd import torch as t from PIL import Image from torchvision.transforms import ToTensor, ToPILImaget.__version__2.1.13.1 图像相关层 图像相关层主要包括卷积层&#xff08;Conv&#xff09;、池化层&#xff08;Pool&#xff09;…

node.js和浏览器之间的区别

node.js是什么 Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;可以在服务器端运行JavaScript代码 Node.js 在浏览器之外运行 V8 JavaScript 引擎。 这使得 Node.js 非常高效。 浏览器如何运行js代码 nodejs运行环境 在浏览器中&#xff0c;大部分时间你所…

Linux系统调试课:USB 常用调试方法

文章目录 一、USB调试工具有哪些二、USB相关节点2.1、USB枚举成功标志2.2、USB speed查询2.3、USB 查询PID、VID沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要 介绍 USB 常用调试方法。 一、USB调试工具有哪些

Sanic:一个极速Python Web框架

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Sanic&#xff1a;一个极速Python Web框架&#xff0c;全文3500字&#xff0c;阅读大约12分钟。 随着 Web 应用的日益复杂&#xff0c;选择一个高性能的 Web 框架变得尤为…

扫描器的使用

漏扫器 注意事项 扫描器会给客户的业务造成影响。比如&#xff0c;如果存在sql注入漏洞&#xff08;重大的漏洞&#xff09;的话&#xff0c;会给客户的数据库插入脏数据&#xff0c;后果很严重 主机漏扫 针对IP地址和网段的漏洞扫描&#xff0c;例如&#xff1a;22端口弱口…

LCM-LoRA:a universal stable-diffusion acceleration module

Consistency is All You Need - wrong.wang什么都不用做生成却快了十倍其实也并非完全不可能https://wrong.wang/blog/20231111-consistency-is-all-you-need/ 1.Stable diffusion实在预训练VAE空间训练diffusion model的结果。 2.consistency decoder是用consistency model技…

ISIS默认路由下发的各种机制

作者简介&#xff1a;大家好&#xff0c;我是Asshebaby&#xff0c;热爱网工&#xff0c;有网络方面不懂的可以加我一起探讨 :1125069544 个人主页&#xff1a;Asshebaby博客 当前专栏&#xff1a; 网络HCIP内容 特色专栏&#xff1a; 常见的项目配置 本文内容&am…

017 OpenCV 向量机SVM

目录 一、环境 二、SVM原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、SVM原理 OpenCV中的向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;用于分类和回归分析。它通过找到一个最优的超平…

振弦采集仪在岩土工程中的探索与应用

振弦采集仪在岩土工程中的探索与应用 振弦采集仪是一种常用的测量仪器&#xff0c;在岩土工程中具有重要的应用价值。它主要利用振弦原理&#xff0c;通过测量振动信号的特征参数来分析地下土体的力学特性以及工程中的变形情况。 振弦采集仪早期主要用于建筑物、桥梁、堤坝等…

手机拍照的图片,如何传到电脑上?

手机受性能和屏幕限制&#xff0c;其应用功能也多少会因此而受到影响&#xff0c;比如在金鸣识别的电脑客户端&#xff0c;用户可一次性提交100张的图片进行识别&#xff0c;而在移动端&#xff0c;则最多只能一次三张&#xff0c;如何破这个“局”呢&#xff1f; 一、有扫描仪…

RT-DETR优化:Backbone改进 | UniRepLKNet,通用感知大内核卷积网络,RepLK改进版本 | 2023.11

🚀🚀🚀本文改进: UniRepLKNet,通用感知大内核卷积网络,ImageNet-22K预训练,精度和速度SOTA,ImageNet达到88%, COCO达到56.4 box AP,ADE20K达到55.6 mIoU 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 学姐带你学习YOLOv8,从入门到创新,轻轻松松…

Linux centos8安装JDK1.8、tomcat

一、安装jdk 1.如果之前安装过jdk&#xff0c;先卸载掉旧的 rpm -qa | grep -i jdk 2.检查yum中有没有java1.8的包 yum list java-1.8* 3.yum安装jdk yum install java-1.8.0-openjdk* -y 4.验证 二、安装tomcat Index of /tomcat 可以在这里选择你想要安装的tomcat版本…

Centos7部署Graylog5.2日志系统

Graylog5.2部署 Graylog 5.2适配MongoDB 5.x~6.x&#xff0c;MongoDB5.0要求CPU支持AVX指令集。 主机说明localhost部署Graylog&#xff0c;需要安装mongodb-org-6.0、 Elasticsearch7.10.2 参考&#xff1a; https://blog.csdn.net/qixiaolinlin/article/details/129966703 …

洛谷(md版)

小知识点 1.printf()一行一个双引号“” 2.double->%lf 3.例题 ​​​​​​​​​​​​​​ ​​​4. 这两者不一样 上行&#xff1a;先转化成了浮点数&#xff0c;再运算 下行&#xff1a;先运算的整数&#xff0c;得到结果&#xff0c;再转化成浮点数 no1 no / (…

BiseNet实现遥感影像地物分类

遥感地物分类通过对遥感图像中的地物进行准确识别和分类&#xff0c;为资源管理、环境保护、城市规划、灾害监测等领域提供重要信息&#xff0c;有助于实现精细化管理和科学决策&#xff0c;提升社会治理和经济发展水平。深度学习遥感地物分类在提高分类精度、自动化程度、处理…

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中&#xff0c;我们做了一些GPU实例化的前置准备&…

有个死鬼一直刷咱们接口,用`手机号+验证码`在那乱撞!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 本文的宗旨在于通过对实际场景的案例进行抽复现&#xff0c;教会读者如何对应用的接口以浏览器指纹ID为维度的限流操作&#xff…

CentOS 7.9 安装 k8s(详细教程)

文章目录 安装步骤安装前准备事项安装docker准备环境安装kubelet、kubeadm、kubectl初始化master节点安装网络插件calicowork 加入集群 k8s集群测试 安装步骤 安装前准备事项 一台或多台机器&#xff0c;操作系统 CentOS7.x-86_x64硬件配置&#xff1a;2GB或更多RAM&#xff0…

配置禁止BT下载的示例

如图1所示,企业内用户通过交换机连接到RouterA的Eth2/0/0,并通过RouterA的GE0/0/1接口连接到WAN侧网络。 现在要求在RouterA上通过配置基于智能应用控制SAC(Smart Application Control)的流分类,禁止企业用户进行BT下载。 图1 配置禁止BT下载的组网图: 操作步骤 1.Rout…

爬虫解析-jsonpath (六)

jsonpath只能解析本地文件 jsonpath的使用&#xff1a; obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习&#xff1a;使用jsonpath解析JSON文件 3.使用jsonpath抓取…