C语言-指针作为函数返回值及二级指针
1、指针作为函数返回值
c语言允许函数的返回值是一个指针(地址)我们将这样的函数称为指针函数,下面的例子定义一了一个函数strlong(),用来返回两个字符串中较长的一个:
1. #include <stdio.h>
2. #include <string.h>
3.
4. char *strlong(char *str1, char *str2){
5. if(strlen(str1) >= strlen(str2)){
6. return str1;
7. }else{
8. return str2;
9. }
10. }
11.
12. int main(){
13. char str1[30], str2[30], *str;
14. gets(str1);
15. gets(str2);
16. str = strlong(str1, str2);
17. printf("Longer string: %s\\n", str);
18.
19. return 0;
20. }
运行结果:
C Language↙
c.biancheng.net↙
Longer string: [c.biancheng.net](<http://c.biancheng.net/>)
用指针函数作为函数返回值时需要注意的一点时,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回指针请尽量不要指向这些数据,c语言没有任何机制来保证这些数据会一直有效,它们在后续使用过程中可能会引发运行时错误,请看下面的例子:
1. #include <stdio.h>
2.
3. int *func(){
4. int n = 100;
5. return &n;
6. }
7.
8. int main(){
9. int *p = func(), n;
10. n = *p;
11. printf("value = %d\\n", n);
12. return 0;
13. }
运行结果:
value = 100
n是func()内部的局部变量,func()反悔了指向n的指针,根据上面的观点,func()运行结束后n被销毁,是用p应该获取不到n的值,但是从运行结果来看,我们的推理好像是错误的,func()运行结束后p依然可以获取局部变量n的值,这个上面的观点不是相对的吗?
为了进一步看清问题的本质,不放将上面的代码稍作修改,在第9-10行之间增加一个函数调用,看看会有什么效果:
1. #include <stdio.h>
2.
3. int *func(){
4. int n = 100;
5. return &n;
6. }
7.
8. int main(){
9. int *p = func(), n;
10. printf("c.biancheng.net\\n");
11. n = *p;
12. printf("value = %d\\n", n);
13. return 0;
14. }
运行结果:
[c.biancheng.net](<http://c.biancheng.net/>)
value = -2
可以看到,现在p指向的数据已经不是原来n的值了,它编程了一个毫无意义的甚至有些怪异的值。与前面的代码相比,该段代码仅仅是在*p之前增加了一个函数调用,这一细节的不同却导致运行结果有天壤之别,究竟是为什么呢?
前面我们说函数运行结束后会销毁所有的局部数据,这个观点并没错,大部分 C 语言教材也都强调了这一点。但是,这里所谓的销毁并不是将局部数据所占用的内存全部抹掉,而是程序放弃对它的使用权限,弃之不理,后面的代码可以随意使用这块内存。对于上面的两个例子,func() 运行结束后 n 的内存依然保持原样,值还是 100,如果使用及时也能够得到正确的数据,如果有其它函数被调用就会覆盖这块内存,得到的数据就失去了意义。
第一个例子在调用其他函数之前使用 *p 抢先获得了 n 的值并将它保存起来,第二个例子显然没有抓住机会,有其他函数被调用后才使用 *p 获取数据,这个时候已经晚了,内存已经被后来的函数覆盖了,而覆盖它的究竟是一份什么样的数据我们无从推断(一般是一个没有意义甚至有些怪异的值)。
2、二级指针
指针可以指向一份普通类型的数据,例如int、double、char等,也可以指向一份指针类型的数据,例如int *、doubule *、char *等。
如果一个指针指向的是另一个指针,我们就称它为二级指针,或者指向指针的指针。
假设有一个int类型的变量a,p1是指向a的指针变量,p2又是指向p1的指针变量,他们的关系如下图:
将这种关系转换为c语言代码:
1. int a =100;
2. int *p1 = &a;
3. int **p2 = &p1;
指针变量也是一种变量,也会占用存储空间、也可以使用&获取它的地址。c语言不限制指针的级数,每增加一级指针,在定义指针变量是就得增加一个星号*。p1是一级指针,指向普通类型的数据,定义时只有一个*;p2是二级指针,指向一级指针p1,定义时有两个*。
如果我们希望在定义一个三级指针p3,让它指向p2,那么可以这样写:
int ***p3 = &p2;
四级指针也是类似的道理:
int ****p4 = &p3;
实际开发中会经常使用一级指针和二级指针,几乎用不到高级指针。
想要获取指针指向的数据是,一级指针加一个*,二级指针加两个*,三级指针加三个*,以此类推,请看代码:
1. #include <stdio.h>
2.
3. int main(){
4. int a =100;
5. int *p1 = &a;
6. int **p2 = &p1;
7. int ***p3 = &p2;
8.
9. printf("%d, %d, %d, %d\\n", a, *p1, **p2, ***p3);
10. printf("&p2 = %#X, p3 = %#X\\n", &p2, p3);
11. printf("&p1 = %#X, p2 = %#X, *p3 = %#X\\n", &p1, p2, *p3);
12. printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\\n", &a, p1, *p2, **p3);
13. return 0;
14. }
运行结果:
100, 100, 100, 100
&p2 = 0X28FF3C, p3 = 0X28FF3C
&p1 = 0X28FF40, p2 = 0X28FF40, *p3 = 0X28FF40
&a = 0X28FF44, p1 = 0X28FF44, *p2 = 0X28FF44, **p3 = 0X28FF44
以三级指针p3为例来分析上面的代码,*p3等价于((p3))。p3得到的是p2的值,也即使p1的地址;(p3)得到的是p1的值,也即是a的地址,经过三次“取值”操作后,((*p3))得到的才是a的值。
相关文章:
C语言-指针作为函数返回值及二级指针
1、指针作为函数返回值 c语言允许函数的返回值是一个指针(地址)我们将这样的函数称为指针函数,下面的例子定义一了一个函数strlong(),用来返回两个字符串中较长的一个: 1. #include <stdio…...
kotlin
参考资料: 参考资料 1、kotlin编译原理是先编译为class文件,再在java 虚拟机上执行2、变量 var 1 变量 val 2 常量 kotlin存在类型推导机制 var c:Int 1kotlin不存在基本类型,将全部使用对象类型3、函数 fun test(){}fun add(a:Int,b Int…...
【STM32】USART串口数据包
数据包的作用是将一个个单独的数据打包起来,方便进行多字节的数据通信 数据包格式 HEX数据包 文本数据包 数据包接收 HEX数据包接收(固定包长) 文本数据包接收(可变包长) 串口收发HEX数据包 接线图 Serial模块 se…...
开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS,并结合cpolar内网穿透工…...
echarts 图表resize() 报错Cannot read properties of undefined (reading ‘type‘)
原因是我使用了this.trainChart来接收数据,应该使用let或者var定义trainChart,就不会出现错误了。 错误代码如下: 原本 定义的echarts export default {data() {return {: null}} }现在 var trainChart null export default { }...
寻的制导律:从理论到应用的全景展示(下)
寻的制导律:从理论到应用的全景展示(下) 第六章 制导系统设计与实现 在制导系统的设计与实现过程中,系统需求分析、硬件与软件架构设计以及实现与测试方法是关键的三个环节。通过系统化的方法论,可以确保制导系统在复…...
ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略
摘要: 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面,通过具体方法分析、数据引用与大模型工具介绍,旨在为短视频营销领域提…...
使用PSpice进行第一个电路的仿真
1、单击【开始】菜单,选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框(提示:项目名称不要出现汉字); ②选择【Analog or Mixed A/D】; ③单击【…...
SparkSQL 对 SQL 查询的优化静态优化和动态优化两大部分介绍
SparkSQL 对 SQL 查询的优化主要分为 静态优化 和 动态优化 两大部分,其中静态优化主要在查询编译时进行,而动态优化则是在查询执行过程中进行。SparkSQL 的优化包括了多种技术,例如 RBO(基于规则的优化)、CBO…...
Android 网络请求(二)OKHttp网络通信
学习笔记 OkHttp 是一个非常强大且流行的 HTTP 客户端库,广泛用于 Android 开发中进行网络请求。与 HttpURLConnection 相比,OkHttp 提供了更简单、更高效的 API,特别是在处理复杂的 HTTP 请求时。 如何使用 OkHttp 进行网络请求 以下是使…...
游戏引擎学习第15天
视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出(IO)操作的讨论。主要分为两类: 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源,例如音乐、音效、美术资源(如 3D 模型和…...
【机器学习】聚类算法原理详解
聚类算法 性能度量: 外部指标 jaccard系数(简称JC)FM指数(简称FMI)Rand指数(简称RI) 内部指标 DB指数(简称DBI)Dunn指数(简称DI) 距离计算&am…...
android 使用MediaPlayer实现音乐播放--基础介绍
Android 多媒体框架支持播放各种常见媒体类型,因此 可轻松地将音频、视频和图片集成到您的应用中。你可以播放音频或 从存储在应用资源(原始资源)的媒体文件(原始资源)中获取独立文件 或从通过网络连接到达的数据流中&…...
【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南
文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…...
transformer.js(二):关于pipe管道的一切
前面的章节 transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景介绍了transformer.js的应用场景。 pipe 管道(Pipeline) 作为 Transformer.js 的核心功能之一…...
django宠物服务管理系统
摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商,并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统,用户可以更加方便…...
设计模式的学习思路
学习设计模式确实需要一定的时间和实践,尤其是对于刚入门的人来说,因为一开始可能会感到有些混淆,尤其是当多个设计模式看起来有相似之处时。本博客是博主学习设计模式的思路历程,大家可以一起学习进步。设计模式学习-CSDN博客 1…...
PgSQL即时编译JIT | 第1期 | JIT初识
PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...
比rsync更强大的文件同步工具rclone
背景 多个复制,拷贝,同步文件场景,最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份,单次性数据备份。 rsync是单线程的,开源的mrsync是多线程的,但适用范围没…...
【eNSP】OSPF、RIP与静态路由互通实验(四)
OSPF、RIP与静态路由互通实验 实验目的实验要求实验步骤步骤 1:配置R1、R2、R3、R4、R5、R6、R7的端口ip步骤 2:配置R1、R2、R3的OSPF动态路由协议步骤 3:配置R3、R4、R5的RIP动态路由协议步骤 4:配置R3作为边界路由器,…...
MODBUS TCP转CANOpen网关
Modbus TCP转CANopen网关 型号:SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上,并和CANOpen设备…...
Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速
11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展,旗下人形机器人Figure 02在生产线上的性能得到了显著提升,机器人组成自主舰队,依托端到端技术,速度提高了400%,执行任务成功率提…...
Linux tcpdump 详解教程
简介 tcpdump 是一款在 Linux 平台上广泛使用的网络抓包工具。它可以捕获整个 TCP/IP 协议族的数据包,并支持对网络层、协议、主机、端口等进行过滤。tcpdump 提供了强大的过滤功能,允许使用 and、or、not 等逻辑语句来筛选数据包,非常适合用…...
o1的风又吹到多模态,直接吹翻了GPT-4o-mini
开源LLaVA-o1:一个设计用于进行自主多阶段推理的新型VLM。与思维链提示不同,LLaVA-o1独立地参与到总结、视觉解释、逻辑推理和结论生成的顺序阶段。 LLaVA-o1超过了一些更大甚至是闭源模型的性能,例如Gemini-1.5-pro、GPT-4o-mini和Llama-3.…...
记录下,用油猴Tampermonkey监听所有请求,绕过seesion
油猴Tampermonkey监听所有请求,绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口,这个接口的页面入口被隐藏掉了,不能通过页面调用,幸好之前有想过逆向破解通过账号密码模拟登录后拿到token,请求该…...
Golang语言整合jwt+gin框架实现token
1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…...
SpringBootTest启动时出现循环依赖问题
在公司项目开发中由于SpringBoot启动类配置了setAllowCircularReferences为true在特定的业务逻辑下需要该配置,但我们需要使用SpringBootTest单元测试的时候引入我们开发的配置文件发现不生效, 解决方法: SpringBootTest(properties "…...
微信小程序——01开发前的准备和开发工具
一、踏上小程序开发之旅前的准备 (一)小程序账号注册 开启注册流程 首先,在浏览器中打开 “微信公众平台”(微信公众平台)。进入平台后,你会看到右上角有一个 “立即注册” 按钮,点击它&#x…...
华为欧拉系统使用U盘制作引导安装华为欧拉操作系统
今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤: 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 ,用于制作U盘启动 下载一个引导程序制作工具,我使用…...
【Java 集合】Collections 空列表细节处理
问题 如下代码,虽然定义为非空 NonNull,但依然会返回空对象,导致调用侧被检测为空引用。 实际上不是Collections的问题是三目运算符返回了null对象。 import java.util.Collections;NonNullprivate List<String> getInfo() {IccReco…...
2021 年 3 月青少年软编等考 C 语言三级真题解析
目录 T1. 找和为 K 的两个元素思路分析T2. Minecraft思路分析T3. 踩方格思路分析T4. 苹果消消乐思路分析T5. 流感传染思路分析T1. 找和为 K 的两个元素 在一个长度为 n ( n < 1000 ) n\ (n < 1000) n (n<1000) 的整数序列中,判断是否存在某两个元素之和为 k k k…...
【PyTorch】Pytorch中torch.nn.Conv1d函数详解
1. 函数定义 torch.nn.Conv1d 是 PyTorch 中用于一维卷积操作的类。定义如下: 官方文档:https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1,paddi…...
Linux运维篇-iscsi存储搭建
目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上,特别是以太网上进行数据块传输的标准,它是一种基于IP Storage理论的存储技术,该技术是将存储行业广泛…...
通过shell脚本分析部署nginx网络服务
题目: 1.接收用户部署的服务名称 2.判断服务是否安装 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务 没有安装;安装对应的软件包 3.测试 判断服务是否成功运行; 已运行&am…...
Cyberchef使用功能之-多种压缩/解压缩操作对比
cyberchef的compression操作大类中有大量的压缩和解压缩操作,每种操作的功能和区别是什么,本章将进行讲解,作为我的专栏《Cyberchef 从入门到精通教程》中的一篇,详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…...
【http】http协议状态码
目录 1. 说明2. 信息性状态码3. 成功状态码4. 重定向状态码5. 客户端错误状态码6. 服务器错误状态码 1. 说明 1.HTTP协议状态码是指在HTTP通信过程中,服务器向客户端返回的三位数值的数字代码,用于表示服务器对请求的处理结果和状态。2.这些状态码由三个…...
tcpdump交叉编译
TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程,下载地址都只给了一个英文的官网首页, 你尽可以试试,从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程,下载地址都只给了一个英文的官网首页&#…...
Python 脚本程序加密
文章目录 前言编译成 .pyc 文件编译成可执行文件PyInstallerNuitka PyArmor加密 Python 脚本生成可执行文件设置授权管理规则 前言 Python 脚本程序加密推荐。 编译成 .pyc 文件 .pyc 文件是 Python 源码文件 (.py) 编译后的二进制文件,能提高加载速度࿰…...
记录一次mysql的一些操作,mysql的docker,mysql备份,mysql表复制
我是用的是mysql的docker容器版本。 1、使用mysql的docker容器版本 1.1 启动 docker run --name <docker_name> \-e MYSQL_ROOT_PASSWORD<password> \-v /datavolume2/mysql:/var/lib/mysql \-p 3306:3306 \-d hub.atomgit.com/arm64v8/mysqldocker_name是启动后…...
Slate文档编辑器-WrapNode数据结构与操作变换
Slate文档编辑器-WrapNode数据结构与操作变换 在之前我们聊到了一些关于slate富文本引擎的基本概念,并且对基于slate实现文档编辑器的一些插件化能力设计、类型拓展、具体方案等作了探讨,那么接下来我们更专注于文档编辑器的细节,由浅入深聊…...
2024信创数据库TOP30之蚂蚁集团OceanBase
数据库作为存储、管理和分析这些数据的关键工具,其地位自然不言而喻。随着信息技术的日新月异,数据库技术也在不断演进,以满足日益复杂多变的市场需求。近日,备受瞩目的“2024信创数据库TOP30”榜单由DBC联合CIW/CIS权威发布&…...
Unity类银河战士恶魔城学习总结(P130 SkillTree UI 技能树)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了技能树的UI设置 UI_SKillTreeSlot.cs 这段代码定义了…...
Web服务器
简介 www是world wide web的缩写,也就是全球信息广播的意思。通常说的上网就是使用www来查询用户 所需要的信息。www可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方 式将信息以Internet传递到世界各处去。 与其他服务器类似…...
.net将List<实体1>的数据转到List<实体2>
比如说有两个实体Class,如下: //实体1 public class People {public string Name {get;set;}public int Age {get;set;} } //实体2 public class Student {public string Name {get;set;}public int Age {get;set;}public string ClassRoom {get;set;}/…...
django从入门到精通(五)——表单与模型
好的,下面将详细介绍 Django 的表单与模型,包括它们的定义、使用、如何在 Django Admin 中结合使用,以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类,用于定义数据库中的数据结…...
Keepalived部署
Keepalived部署 安装配置单VIP模式配置master节点查看节点IP信息配置 keepalived.conf启动且加入开机自启查看是否生效 配置backup节点配置 keepalived.conf启动且加入开机自启查看是否生效 主备测试 多VIP配置 keepalived.conf查看IP 安装 dnf install -y keepalived配置 单…...
怀旧游戏打卡清单(TODO)
感觉忙碌了好久好久,真的好想休息一下。。 整理一下将来休息时候的打卡清单,不工作了去个海边狂打游戏,想想就惬意啊。当然,最好找个work from home,去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说…...
ssm160基于Java技术的会员制度管理的商品营销系统的设计与实现+vue(论文+源码)_kaic
毕 业 设 计(论 文) 题目:商品营销系统计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本商品营销系统就是在这…...
springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
目录 一、请求映射路径相同,根据请求方式区分不同接口。 1、例子。 二、注解JsonFormat。 1、基本介绍。 2、日期和时间格式化。 3、时区设置。 4、反序列化。 三、注解JsonIgnore。 1、基本介绍。 2、主要作用。 一、请求映射路径相同,根据请求方式区分…...
Redis面试篇笔记(持续更新)
一、redis主从集群 单节点redis的并发能力是由上限的,要进一步提高redis的并发能力可以搭建主从集群,实现读写分离,一主多从,主节点写数据,从节点读数据 部署redis主从节点的docker-compose文件命令解析 version: &q…...