栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++函数返回数组指针,以及通过指针操作数组的方法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++函数返回数组指针,以及通过指针操作数组的方法

C++函数返回数组指针,以及通过指针操作数组的方法

日期:2021-04-01

作者:yuallart

语言:C/C++(MinGW)

编译器:CLion 2021.3.4

特殊符号规则:

符号说明示例
【】代表需要在符号中插入响应的代码,括号中并不代表实际代码【插入整数】
==>表示运行后最终输出的结果==> Hello world!
()示例数据【插入整数(10)】
“”代表文字说明中使用到的代码“int i = 0;”

文章目录
  • C++函数返回数组指针,以及通过指针操作数组的方法
    • @[TOC](文章目录)
      • 前言
      • 正文
      • 结尾
前言

对于c++来说,指针可能真的是一个很难理解的概念,但是用好指针对学好c++至关重要,现在我就来演示怎么通过函数返回数组指针的方法,但是请注意,本文更多讲述的是c++中相关的问题,c的内容占比很小。

正文

我们先导入所需要的头文件和命名空间,然后看下述的代码

#include 
#include 
#include 
using namespace std;

在函数中创建一个数组,需要使用 “new” 关键字来分配一个内存空间,存放数组,让这个数组不会因为函数的运行时结束而被销毁,通过一个指针变量来保存这个数组的内存空间,指针释放,这个数组也会被销毁。

“auto” 被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存,用于储存不确定的变量类型,类似于JavaScript的 “var” (c++11标准)

auto array() {
    auto *strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    strList[3] = "";
    return strList;
}

上述代码中用到了 “auto” ,在函数中它可以立即指定函数类型,比如说这样

auto array() -> string * {
    ...
}

当然也可以不使用 “auto” 关键字,直接指定

string * array() {
    string * strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    strList[3] = "";
    return strList;
}

我们在"int main()"中接受这个函数,并赋值给一个指针

auto array() {
    auto *strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    strList[3] = "";
    return strList;
}
int main() {
    string *p = array();
}

可以试着打印一下数组的值,比如想获取的数组的索引对应的值,索引现在定义为 “i” ,我们可以这么写

auto array() {
    auto *strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    strList[3] = "";
    return strList;
}
int main() {
    // 将函数赋值给指针变量
    string *p = array();
    // "i" 为想要获取的索引对应的值
    int i = 0;
    cout << *(p+i) << endl;
    // 一定要记得及时释放指针变量,不然会导致内存泄露的问题
    delete[] p;
}

==> tom

如果想要遍历,我们可以先使用 “while” 循环方式来遍历,这种方法如果将类型换为 “char” 或者 “int” ,稍作修改可以完美适配c的数组指针传递

auto array() {
    auto *strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    strList[3] = "";
    // 还可以这么写 "strList[3]" 不用赋值,使用 "empty()" 判断为空,这样甚至不触发 "string" 的构造函数,开销更小,但建议第一种写法。
    return strList;
}

int main() {
    string *p = array();
    try {
        // 表达式也可以这么写 "(!p->empty())" 使用 "string" 的方法来判断为不为空
        while (*p != "") {
            cout << *p << endl;
            *++p;
        }
    } catch (exception exception) {
        cout << "fail" << endl;
    }
    // 一定要记得及时释放指针变量,不然会导致内存泄露的问题
    delete[] p;
    getchar();
    return 0;
}

输出的结果如下图,通过 “string” 的 “empty()” 方法就可以判断出该元素是否为空,也就是约定好的最后一位,防止数组访问越界

==> tom

==> allart

==> joy

当然也可以使用为 “for()” 循环来判断,这种方法通过 “string” 的 “length()” 来判断数组的长度,可以不用在末尾添加相关的判断符

auto array() {
    auto *strList = new string[4];
    strList[0] = "tom";
    strList[1] = "allart";
    strList[2] = "joy";
    return strList;
}

int main() {
    string *p = array();
    try {
        for (int i = 0; i < p->length(); ++i) {
            // "*(p + i)" 可以等价于 "array[i]"
            cout << "当前索引:" << i << "t" << *(p + i) << endl;
        }
    } catch (exception exception) {
        cout << "fail" << endl;
    }
    // 一定要记得及时释放指针变量,不然会导致内存泄露的问题
    delete[] p;
    getchar();
    return 0;
}

以上两种方式都能很好的遍历数组对象,但是更推荐大家以下这种方式来传递数组给函数,让函数完成修改数组的操作,这样就不用麻烦的传递指针变量

void array1(string *p, int length) {
    *(p + 0) = "tom";
    *(p + 1) = "allart";
    *(p + 2) = "joy";
}
结尾

文章内容到此结束,c的内容大家举一反三,相信并不难,喜欢的朋友不妨收藏点个赞,下一期更精彩

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850028.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号