C++函数返回数组指针,以及通过指针操作数组的方法
日期:2021-04-01
作者:yuallart
语言:C/C++(MinGW)
编译器:CLion 2021.3.4
特殊符号规则:
符号 | 说明 | 示例 |
---|---|---|
【】 | 代表需要在符号中插入响应的代码,括号中并不代表实际代码 | 【插入整数】 |
==> | 表示运行后最终输出的结果 | ==> Hello world! |
() | 示例数据 | 【插入整数(10)】 |
“” | 代表文字说明中使用到的代码 | “int i = 0;” |
前言
对于c++来说,指针可能真的是一个很难理解的概念,但是用好指针对学好c++至关重要,现在我就来演示怎么通过函数返回数组指针的方法,但是请注意,本文更多讲述的是c++中相关的问题,c的内容占比很小。
正文
我们先导入所需要的头文件和命名空间,然后看下述的代码
#include <iostream>
#include <string>
#include <exception>
using namespace std;
在函数中创建一个数组,需要使用 “new” 关键字来分配一个内存空间,存放数组,让这个数组不会因为函数的运行时结束而被销毁,通过一个指针变量来保存这个数组的内存空间,指针释放,这个数组也会被销毁。
auto array() {
auto *strList = new string[4];
strList[0] = "tom";
strList[1] = "allart";
strList[2] = "joy";
strList[3] = "";
return strList;
}
上述代码中用到了 “auto” ,“auto” 被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存,用于储存不确定的变量类型,类似于JavaScript的 “var” (c++11标准)
在函数中它可以立即指定函数类型,比如说这样
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的内容大家举一反三,相信并不难