首页 > 编程语言 >程序设计部分 指针(三) 第2关:指针作为函数返回值

程序设计部分 指针(三) 第2关:指针作为函数返回值

时间:2024-08-07 13:23:54浏览次数:15  
标签:函数 int 局部变量 Ret 数组 程序设计 返回值 指针

任务描述
本关任务:读取数据建立数组。

相关知识
指针作为函数返回值
指针能作为函数参数,自然也能作为函数的返回值。不过需要注意的是,返回的指针不应该指向函数的局部变量,因为局部变量只在函数这一次被调用期间有效,如果返回了指向局部变量的指针,又在之后的程序中访问了这个指针所指的内容,就会访问越界,可能会引发程序异常,比如:

int* Ret()
{
    int a = 10;//局部变量
    return &a;
}
int main()
{
    int *ptr = Ret();
    cout << *ptr << endl; //访问越界
    *ptr = 0; //写内存也是访问越界
}
指针所指的数据应该在函数返回后依然有效,全局变量就是一种选择,比如:

int a = 0;//全局变量
int* Ret()
{
    return &a; //返回全局变量的地址
}
int main()
{
    int *ptr = Ret();
    cout << *ptr << endl; //正确,因为所指的全局变量依然存在
    *ptr = 0; //正确
}
除此之外,还可以考虑使用静态局部变量。

静态局部变量
静态局部变量与非静态局部变量的区别在于,在函数结束后,静态局部变量依然存在,而且在下次执行函数时使用的仍然是同一个变量。但需要注意的是,它只进行一次初始化,之后调用函数时会跳过初始化的语句。

声明一个静态局部变量只需在开头加上**static关键字**即可,比如:

int* Ret()
{
    static int a = 0; //静态局部变量,并且初始化为0
    cout << a << endl;
    return &a;
}
int main()
{
    int *ptr = Ret();
    *ptr = 10; //正确,因为指向的静态局部变量依然有效
    Ret();
}
得到的结果是:
0
10

可以看到两次调用Ret函数,只有第一次会将其初始化为0。

编程要求
右侧编辑器中有一个函数Read,请在这个函数中读取输入数据,将其放到一个数组并返回数组指针。

输入数据由学员读取,每组输入数据有两行,第一行是一个整数n,范围0 <= n <= 10,第二行有n个数,代表要建立的数组的内容。

数组的长度,请通过Read函数的**len指针参数返回,而包含数组内容的数组直接作为函数的返回值**。

评测系统会按照上述的格式处理返回的指针,然后将其输出。具体见测试说明。

测试说明
平台会对你编写的代码进行测试:

测试输入:
4
1 2 3 4

预期输出:
1 2 3 4

参考代码

#include <iostream>

using namespace std;
/**********   Begin   **********/

//可在此添加其他内容

int * Read(int * len) {
  cin >> * len;
  // 如果长度为0,则返回一个空指针  
  if ( * len == 0) {
    return nullptr;
  }
  // 分配内存以存储数组元素  
  int * arr = new int[ * len];
  // 读取数组元素  
  for (int i = 0; i < * len; i++) {
    cin >> arr[i];
  }
  // 返回数组的指针  
  return arr;
}
/**********   End   **********/

标签:函数,int,局部变量,Ret,数组,程序设计,返回值,指针
From: https://blog.csdn.net/Whovian_Z/article/details/140989394

相关文章

  • 程序设计部分 函数的递归 第4关:使用递归进行自动分析
    任务描述本关任务:计算逆波兰表达式的值。相关知识放苹果问题把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?注意:5,1,1和1,5,1是同一种分法。我们可以先假设有一个函数count(m,n)能告诉我们m个苹果放n个盘子有多少种放法,然后在此基础上进行......
  • Java程序设计:Java IO(2)
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在eclipse中调试代码    掌握Java IO中流的基本概念及使用方法    掌握文件锁、Scanner解析文件的使用方法3实验源代......
  • Java程序设计:Java IO
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在IDEA中调试代码    掌握File类的基本使用    掌握Java IO中流的基本概念及使用方法    掌握文件IO流、缓冲流......
  • 使用 Flask 和 Yolov2 在 uLong32 中使用区域指针检测 2024 年奥林匹克数据集中的浮动
    你好StackOverflow!!!c:我正在使用#Yolov2和embedded#CVSSfordetecting浮动UIeleme#any视频对象实例中的ntse;在eexampl......
  • 类,抽象类,接口作为方法的返回值类型 day10
    /*返回值类型基本类型:引用类型:类:当你看到一个类作为方法的返回值类型的时候,将来方法内部应该返回该类或该类的子类对象抽象类:当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部应该返回继承该抽象类的具体子类对象......
  • 重头开始嵌入式第十三天(指针那些事儿)
    昨天给指针开了个头,今天就正式开始指针的归纳总结了,指针是c语言的特点,可以说没有学指针,就不算学了c,昨天说了指针的概念,定义及使用,今天来讲解一下指针的进阶用法目录指针变量的初始化野指针指针的作用指针与一维数组指针的运算指针迭代写法的排序查找插入排序冒泡排序......
  • 利用指针来升序数组,(冒泡排序)
    我们写完数组后,通过写函数来是代码清晰明了,第一个升序函数,通过传入arr与len,再用冒泡排序的方法即可将数组升序,这里注意,传入arr,也就是数组的首地址,函数用Int*arr接受,这里传入首地址,也就是指针的方法,这个首地址(指针)允许函数内部通过数组索引的方法来访问数组中的其他元素,......
  • 面向对象程序设计——第3章 案例
    案例一水仙花数案例要求【案例目标】用户通过键盘输入一个整数值,判断该数值是否为“水仙花数”。【相关解释】“水仙花数”是指一个3位数,其各位数的三次方和等于该数本身。例如:水仙花例如:153是一个“水仙花数”,因为【案例效果】本案例程序运行的结果如图【具体要......
  • 深圳大学-Java程序设计实验-常用集合类使用
    实验目的熟悉集合类的应用,熟悉String类的应用以及正则表达式的使用。实验内容1张三、李四等人是A社团成员,李四、王五等人是B社团成员,编写一个Java应用程序(要求使用集合类),输出参加A社团的人、参加B社团的人、以及同时参加两个社团的人。在报告中附上程序截图、完整的运行......
  • C:指针学习(1)-学习笔记
    目录前言:知识回顾:1、const1.1const修饰普通变量1.2 const修饰指针变量1.3总结:2、指针运算2.1指针+-整数2.2指针-指针2.3指针的关系运算3、指针的使用结语:前言:距离上一次更新关于初识指针的内容已经有一段时间了,本文旨在继续深入探讨指针的相关知识。在......