• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言 用指针作为函数返回值详解

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言函数返回指针,c语言返回指针,c语言返回数组指针,c语言指针详解,c语言指针详解视频等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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;
}
</div>

运行结果:

C Language↙
c.biancheng.net↙
Longer string: c.biancheng.net

用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据,C语言没有任何机制来保证这些数据会一直有效,它们在后续使用过程中可能会引发运行时错误。请看下面的例子:

#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;
}
</div>

运行结果:

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("c.biancheng.net\n");
  n = *p;
  printf("value = %d\n", n);
  return 0;
}
</div>

运行结果:

c.biancheng.net
value = -2

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

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

关于函数调用的原理以及函数如何占用内存的更多细节,我们将在《C语言和内存》专题中深入探讨,相信你必将有所顿悟,解开心中的谜团。

第一个例子在调用其他函数之前使用 *p 抢先获得了 n 的值并将它保存起来,第二个例子显然没有抓住机会,有其他函数被调用后才使用 *p 获取数据,这个时候已经晚了,内存已经被后来的函数覆盖了,而覆盖它的究竟是一份什么样的数据我们无从推断(一般是一个没有意义甚至有些怪异的值)。

以上就是对 C语言指针作为函数返回值的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言 用指针作为函数返回值详解
  • 深入解析C语言中函数指针的定义与使用
  • C语言中函数与指针的应用总结

相关文章

  • 2017-05-28解决了个困扰了2天的问题,定点运算问题
  • 2017-05-28C与C++ 无参函数的区别解析
  • 2017-05-28C++获取任务栏打开程序窗口示例
  • 2017-05-28C语言求圆周率的简单实现方法
  • 2017-05-28双向链表插入删除基本应用介绍
  • 2017-05-28方阵顺时针旋转的实现代码
  • 2017-05-28Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
  • 2017-05-28C++中函数重载实例详解
  • 2017-05-28C语言 奇偶排序算法详解及实例代码
  • 2017-05-28C++11中lambda、std::function和std:bind详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入C++ 函数映射的使用详解
    • 基于WTL 双缓冲(double buffer)绘图的分析详解
    • C++十六进制宏的用法详解
    • C++快速排序的分析与优化详解
    • C++空类详解
    • C语言十进制转二进制代码实例
    • C++中sting类的简单实现方法
    • 使用dc画笔画矩形、直线与椭圆示例
    • C++设计模式之代理模式
    • 将CString字符串输入转化成整数的实现方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有