返回数组指针的函数

基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用。

定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用  和 返回一个含有10个整型元素的数组的指针 的函数为例。

法一:(不使用别名)

int (*getCopyArr(int (&arr)[]))[]
{
int (*n)[] = (int (*)[])new int[];
for (int i = ; i < ; i++)
(*n)[i] = arr[i];
return n;
}
//note:该函数返回了分配在堆的数组,如果得到该数组后没有释放内存,会导致内存泄漏,这里仅仅作为示例不考虑该问题

法二:

//尾置返回类型 (C++11标准)
auto getCopyArr2(int(&arr)[])->int(*)[]
{
return getArr(arr);
}

法三:

//使用类型别名(1)
typedef int arrT[]; arrT* getCopyArr3(int(&arr)[])
{
return getArr(arr);
}

法四:

//使用类型别名(2)(C++11 标准)
using arrT2 = int[]; arrT2* getCopyArr4(int(&arr)[])
{
return getArr(arr);
}

声明一个  返回数组指针的函数 的 函数指针的方法:

int (*(*getCA)(int(&)[]))[];
getCA = getArr;
//类似于 int sum(int a, int b)函数
//的函数指针 int(*fun)(int, int);

解读: 由内到外顺序阅读理解,*getCA 的*说明getCA 为一个指针;再往外其右边有形参 (int(&)[10])说明其为一个函数指针,其左边又有一个*说明该函数返回的是一个指针;继续往外,由int [10]包围,说明该返回的指针是一个 含有10个元素的数组的指针;故,该声明为 一个返回数组指针的函数的函数指针

参考博文  和 《C++ primer 第5版》

---------------------------------------------------------------------------------------

最后来两个“提神醒脑”的例子:

//声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*
int (*(*p)[])(int *)
//或
int (*(*p[]))(int *)
//来源
//定义一个含4个元素数组的指针,每个元素为 函数的指针,该函数参数为 一个含10个元素的数组的引用 返回值为 含10个元素的数组的指针
int (*(*getCA[4])(int(&)[]))[];

返回指向函数的指针的函数

基础知识:和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针

使用别名:

using F = int(int*,int);
using PF = int(*)(int*,int); PF f1(int); //f1 返回函数指针
F* f2(int); //f2 同上

使用C++11标准的尾置返回类型:

auto f1(int) -> int(*)(int*,in)

直接声明:

int (*f1(int))(int*,int);

解读:由内到外顺序阅读理解,f1(int)有形参说明f1是一个函数,*f1(int) 说明该函数返回一个指针;继续往外发现其由int ()(int*,int)包围,说明该函数返回值为一个函数;故该声明为 一个返回函数指针的函数

C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数的更多相关文章

  1. 【C++】如何接收函数return返回来的数组元素

    转自 https://www.cnblogs.com/Wade-James/p/7965775.html 我们知道return语句作为被调用函数的结束,返回给调用者函数值.一般来说,是返回一个函数值, ...

  2. 服务器返回数组,data[0]得到的总是不对?如何处理?

    我用asp.net MVC 写了服务器代码,返回数组,ajax怎么处理返回的数组内容? 您好,首先用eval将获得的ajax数据转化成json对象并赋值给一个变量. 比如: var obj=eval( ...

  3. Thinking in C++: Pointers to members 指向成员的指针

    通常来说,一个指针(pointer)是一个存储地址的变量,你能在运行时去改变它,并且指针可以指向数据或函数. 但在C++中,指向成员的指针(pointer-to-member)指向的是class或st ...

  4. 【转】const int *p和int * const p的区别(常量指针与指向常量的指针)

    [转]作者:xwdreamer   出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...

  5. Const指针 、 指向const的指针 、引用、指针

    1. const指针和 指向const的指针 指向const的指针: 不允许通过指针来改变其指向的const值 const double *cptr *cptr = 42;  // error! 指针 ...

  6. [笔记]C++声明返回数组指针的函数

    数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...

  7. C语言函数不能返回数组,但可以返回结构体

    为什么C语言函数可以返回结构体,却不可以返回数组?有这样的问题并不奇怪,因为C语言数组和结构体本质上都是管理一块内存,那为何编译器要区别对待二者呢? C语言函数为什么不能返回数组? 在C语言程序开发中 ...

  8. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  9. 用JS编写一个函数,返回数组中重复出现过的元素

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...

随机推荐

  1. oppo手机屏幕录制的详细操作技巧

    说起屏幕录制,肯定我们都使用过各式各样的录屏工具,不管是手机或者电脑自带的,还是第三方录屏工具,是不是都出现过不能正常录屏的,或者没有把声音录制下来等一系列问题,为了给更多的人节约时间,因为笔者使用的 ...

  2. 学习用Node.js和Elasticsearch构建搜索引擎(6):实际项目中常用命令使用记录

    1.检测集群是否健康. curl -XGET 'localhost:9200/_cat/health?v' #后面加一个v表示让输出内容表格显示表头 绿色表示一切正常,黄色表示所有的数据可用但是部分副 ...

  3. 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI-BOX2D

    layout: post title: 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI- ...

  4. 新闻思考-阿里进军游戏产业,苹果发力ARM芯片

    2018.04.03 大家好,这是我开通博客的第一篇文章,我希望在这里分享我的知识,也学习更多的知识,希望大家学习愉快. 阿里进军游戏产业,拿下旅行青蛙的代理权.腾讯一直在进攻阿里的核心业务:电商和支 ...

  5. shell编程-语句(八)

    if else判断语句 if语句 语法格式1: if 条件 then 语句1 语句2 ... 语句n fi 语法格式2: 常用于终端命令提示符中 if [条件]:then 语句:fi if else语 ...

  6. c指针类型的作用

    指针类型的作用 任何类型的指针占用的空间大小都是相同的(32位CPU是4字节:64位CPU是8字节) 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但 ...

  7. c/c++连通图的遍历(深度遍历/广度遍历)

    连通图的遍历(深度遍历/广度遍历) 概念:图中的所有节点都要遍历到,并且只能遍历一次. 深度遍历 广度遍历 深度遍历 概念:从一个给定的顶点开始,找到一条边,沿着这条边一直遍历. 广度遍历 概念:从一 ...

  8. Zabbix WMI监控

    检查Windows OS是否激活,5表示处于通知模式,1表示已激活 wmi.get[root\cimv2,select LicenseStatus FROM SoftwareLicensingProd ...

  9. python简单的监控脚本-利用socket、psutil阻止远程主机运行特定程序

    python简单的监控脚本-利用socket.psutil阻止远程主机运行特定程序 psutil是一个跨平台的库(http://code.google.com/p/psutil/),能够轻松的实现获取 ...

  10. Linux 系统出现电流音解决方案

    迫于Windows 系统最近的各种故障,今天脱坑换了openSUSE Linux ,在上网途中播放视频时偶尔会出现电流音,虽然影响不大,但是还是进行了一些排查. 通过观察电流音出现时的系统负载的波段, ...