C语言指针作为函数返回值

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数

我们定义一个函数 strlong(),用来返回两个字符串中较长的一个:

#include <stdio.h>
#include <string.h>char *strlong(char *str1, char *str2){if(strlen(str1) >= strlen(str2)){return str1;}else{return str2;}
}int main(){char str1[30], str2[30], *str;gets(str1);gets(str2);str = strlong(str1, str2);printf("Longer string: %s\n", str);return 0;
}

运行结果:

C Language↙
www.baidu.com↙
Longer string: www.baidu.com

注意,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据。

示例

#include <stdio.h>int *func(){int n = 100;return &n;
}int main(){int *p = func(), n;n = *p;printf("value = %d\n", n);return 0;
}

运行结果:

value = 100

n 是 func() 内部的局部变量,func() 返回了指向 n 的指针,func() 运行结束后 n 将被销毁,使用 *p 应该获取不到 n 的值。但是从运行结果来看,我们的推理好像是错误的,func() 运行结束后 *p 依然可以获取局部变量 n 的值,这个上面的观点不是相悖吗?

为了进一步探讨,不妨将上面的代码稍作修改,在第9~10行之间增加一个函数调用,看看会有什么效果:

#include <stdio.h>int *func(){int n = 100;return &n;
}int main(){int *p = func(), n;printf("www.baidu.com\n");n = *p;printf("value = %d\n", n);return 0;
}

运行结果:

www.baidu.com
value = -2

可以看到,现在 p 指向的数据已经不是原来 n 的值了,它变成了一个毫无意义的值。与前面的代码相比,该段代码仅仅是在 *p 之前增加了一个函数调用,却导致运行结果有天壤之别,究竟是为什么呢?

前面我们说函数运行结束后会销毁所有的局部数据,这个观点正确。但是,这里所谓的销毁并不是将局部数据所占用的内存全部抹掉,而是程序放弃对它的使用权限,弃之不理,后面的代码可以随意使用这块内存。对于上面的两个例子,func() 运行结束后 n 的内存依然保持原样,值还是 100,如果使用及时也能够得到正确的数据,如果有其它函数被调用就会覆盖这块内存,得到的数据就失去了意义。

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

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

相关文章

【蓝桥杯每日一练】 斐波那契数列

目录 1.说明 2.原理 3.python实现 第一种&#xff1a; 第二种&#xff1a; 第三种 第四种 1.说明 Fibonacci为1200年代的欧洲数学家&#xff0c;在他的着作中曾经提到&#xff1a;「若有一只免子每个月生一只小免子&#xff0c;一个月后小免子也开始生产。起初只有一只免…

C语言二级指针

指针可以指向一份普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一份指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

R 安装详解

目录 1.R软件 的下载 1.1 R下载 1.2 RStudio下载 2.辅助软件 notepad 3.R 扩展软件包的安装与管理 4.基本 R 软件的用法 1.基本运行 2.项目目录 5.RStudio 软件 1.介绍 2.项目 3.帮助 4.使用历史命令 5.放大显示某一窗格 6.运行程序 7.中文编码问题 8.Rmd 文件 …

R 基础入门(1)

目录 一、四则运算 练习&#xff1a; 二、数学函数 1.数学函数——平方根、指数、对数 2.数学函数——取整 3.数学函数——三角函数 4.数学函数——反三角函数 5.分布函数和分位数函数 三、输出 1.简单输出 2.用 sink() 函数作运行记录 练习 四、向量计算与变量赋值…

C语言二维数组指针

二维数组在概念上是二维的&#xff0c;有行和列&#xff0c;但在内存中所有的数组元素都是连续排列的&#xff0c;它们之间没有“缝隙”。 以二维数组 a 为例&#xff1a; int a[3][4] { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };从概念上理解&#xff0c;a 的分布像一…

R 基础入门(2)

目录 一、绘图 1.曲线图 curve() 函数 2.加参考线 abline() 3.条形图 barplot() 4.散点图 plot() 练习&#xff1a; 二、读取csv文件 1.表格数据 2.读入表格数据 3.分类变量频数统计 4.数值型变量的统计 三、调用自定义函数 一、绘图 1.曲线图 curve() 函数 用 …

【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)

目录 1.说明 ​2.python实现 1.说明 巴斯卡三角形又叫杨辉三角&#xff0c;贾宪三角形 他有以下 性质&#xff1a; 前提&#xff1a;端点的数为1&#xff08;这不是废话吗&#xff0c;头上那个端点不是1还是三角形吗&#xff09; 1、每个数等于它上方两数之和。 2、每行数…

C语言多功能计算器

最近经过一段时间的C语言学习&#xff0c;我使用C语言制作了一个多功能计算器&#xff0c;想要给大家分享一下。 计算器设计流程 1 . 实现基本的加减乘除运算。 2 . 能够实现开方&#xff0c;立方&#xff0c;平方等复杂运算。 3 . 整体的界面展示&#xff0c;显示更加清晰易…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

C语言颜色设置

C语言文字颜色和背景颜色设置 代码 #include <stdio.h> #include <stdlib.h>int main() {system("color 11") //背景色和文字颜色system("pause")&#xff1b;return 0; }如上代码是输出蓝色背景和蓝色文字。 在所需要改变窗口颜色的位置调…

因子分析——matlab

目录 一、起源 二、基本思想 三、算法用途 四、实例详解 1.读取数据 2.数据标准化 3.两种不同的做法 3.1 不用函数 3.2 factoran()法 4.对因子得分进行排序 5.对因子得分进行画图 一、起源 因子分析的起源是这样的&#xff1a;1904年英国的一个心理学家发现学生的英…

因子分析——python

目录 一、起源 二、基本思想 三、算法用途 四、因子分析步骤 五、factor_analyzer库 四、实例详解 1.导入库 2.读取数据 3.充分性检测 3.1 Bartletts球状检验 3.2 KMO检验 4.选择因子个数 4.1 特征值和特征向量 4.2 可视化展示 4.3 可视化中显示中文不报错 5.因…

【蓝桥杯每日一练】 三色旗

目录 1.说明 2.解法 3.python实现 第一种 第二种 第三种 1.说明 三色旗的问题最早由E.W.Dijkstra所提出&#xff0c;他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人)&#xff0c;而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子&#xff0c;上面有红…

C语言结构体数组

结构体数组&#xff0c;是指数组中的每个元素都是一个结构体。 定义结构体数组和定义结构体变量的方式类似。 示例 struct stu{char *name; //姓名int num; //学号int age; //年龄char group; //所在小组 float score; //成绩 }class[5];表示一个班级有5个学生。 结构…

C语言结构体指针

当一个指针变量指向结构体时&#xff0c;我们就称它为结构体指针。 结构体指针的定义形式一般为&#xff1a; struct 结构体名 *变量名;下面是一个定义结构体指针的实例&#xff1a; //结构体 struct stu{char *name; //姓名int num; //学号int age; //年龄char group; /…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

熵权法 —— python

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 四、实例分析 1.导入相关库 2.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.…

C语言枚举类型详解

情景进入 在编程的时候&#xff0c;有些数据的取值往往是有限的&#xff0c;只能是非常少量的整数&#xff0c;并且最好为每个值都取一个名字&#xff0c;以方便在后续代码中使用&#xff0c;比如一个星期只有七天&#xff0c;一年只有十二个月&#xff0c;一个班每周有六门课…

R语言基础入门(3)之数据类型与相应运算1

目录 一、常量与变量 1.常量 2.变量 二、数据类型 三、数值型向量 3.1 c() 函数 3.2 length(x) 3.3 numeric() 四、向量运算 1.标量和标量运算 2.向量与标量运算 3.等长向量运算 4.不等长向量的运算 五、向量函数 1.向量化的函数 2.排序函数 3.统计函数…

C语言位运算详解

C语言位运算包括&#xff1a;按位与运算、或运算、异或运算、左移运算、右移运算。 位运算&#xff0c;就是对一个比特&#xff08;Bit&#xff09;位进行操作。比特&#xff08;Bit&#xff09;是一个电子元器件&#xff0c;8个比特构成一个字节&#xff08;Byte&#xff09;…