C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数
返回数组指针的函数
基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用。
定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有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++ —— 返回数组指针的函数 和 返回指向函数的指针的函数的更多相关文章
- 【C++】如何接收函数return返回来的数组元素
转自 https://www.cnblogs.com/Wade-James/p/7965775.html 我们知道return语句作为被调用函数的结束,返回给调用者函数值.一般来说,是返回一个函数值, ...
- 服务器返回数组,data[0]得到的总是不对?如何处理?
我用asp.net MVC 写了服务器代码,返回数组,ajax怎么处理返回的数组内容? 您好,首先用eval将获得的ajax数据转化成json对象并赋值给一个变量. 比如: var obj=eval( ...
- Thinking in C++: Pointers to members 指向成员的指针
通常来说,一个指针(pointer)是一个存储地址的变量,你能在运行时去改变它,并且指针可以指向数据或函数. 但在C++中,指向成员的指针(pointer-to-member)指向的是class或st ...
- 【转】const int *p和int * const p的区别(常量指针与指向常量的指针)
[转]作者:xwdreamer 出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...
- Const指针 、 指向const的指针 、引用、指针
1. const指针和 指向const的指针 指向const的指针: 不允许通过指针来改变其指向的const值 const double *cptr *cptr = 42; // error! 指针 ...
- [笔记]C++声明返回数组指针的函数
数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...
- C语言函数不能返回数组,但可以返回结构体
为什么C语言函数可以返回结构体,却不可以返回数组?有这样的问题并不奇怪,因为C语言数组和结构体本质上都是管理一块内存,那为何编译器要区别对待二者呢? C语言函数为什么不能返回数组? 在C语言程序开发中 ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- 用JS编写一个函数,返回数组中重复出现过的元素
用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...
随机推荐
- Jedis 简单案例
POM 依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> < ...
- [Intellij] 在IntelliJ IDEA 中创建运行web项目
安装工具 1.JDK7+ 2.IntelliJ Idea 工具(下载安装后,网上找注册码破解即可) 3.tomcat7+ 解压缩版 明确两个概念: 1.Project:类似于eclipse的works ...
- Android gradle实现多渠道号打包
在build.gradle中添加 productFlavors{ LETV { applicationId "×××××××××××" //包名 buildConfigFiel ...
- Vue项目用于Ios和Android端开发
起因 前公司商城App项目使用的是H5开发,有微信公众号.Ios和Android三个版本,H5版本是自己写的一套框架,已经用了有些年头了,承载不下不断涌现出的新需求.而Ios和Android端通过we ...
- Linux 进程后台运行的几种方式 screen
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80580779 本文出自[赵彦军的博客] screen是Linux窗口管理器,用户可 ...
- 被遗弃的depends2.2,替换解决方案——VS命令行
vs的早期版本提供了depends工具,最新版本是2.2,已经不再更新了,网站是dependencywalker.com. 现在,我们可以使用vs开发人员命令行,dumpbin工具,导出二进制文件的信 ...
- spring4笔记----常见的java的字符类型与xml匹配
private List<String> schools; <property name="schools"> <list> <value ...
- June 15. 2018 Week 24th Friday
If at first you don't succeed, then dust yourself off and try again. 失败了没关系,重振旗鼓,从头再来. From Aaliyah, ...
- TOPWAY智能彩色TFT液晶显示模块
TOPWAY 20年来专注工业显示, 以为全球工业用户提供稳定可靠和容易使用的液晶显示模块为己任, 智能彩色TFT液晶显示模块(以下简称智能模块), 就是我们在容易使用TFT 彩色液晶显示方向上为广大 ...
- 11.scrapy框架持久化存储
今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...