Java可以轻易返回一个数组,但是C/C++却不能直接返回一个数组,原因是C++中数组不是一个类型。因此不能直接返回。常见的C++返回多余一个值的方法有:
-----------------------返回静态变量-------------------------------------
char *SubFunction(void)
{
static char szText[5] = "adfa"; // 用静态空间
//对p进行赋值操作
return szText;
}
void Caller() // 这个函数调用SubFunction
{
TRACE("%s\n", SubFunction);
}
----------------动态开辟空间--------------
int (*retArray())[10]
{
int (*a)[10];
int i=0; /*动态开辟空间*/
a=calloc(10,sizeof(int));
/*赋值*/
for(i=0;i<10;i++)
{
(*a)[i]=i;
}
return a;
}
但是动态开辟的空间,需要手动清理
int main()
{
int (*b)[10];
/*函数返回指向数组的指针*/
b=retArray();
/*打印第一个元素*/
printf("%d\n",(*b)[0]);
/*释放空间*/
free(b);
return 0;
}
----------------------返回一个数据结构---------------------
#include <stdio.h>
typedef struct
{
int a[10];
}RETA;
RETA retArray()
{
RETA x;
int i=0;
for(i=0;i<10;i++)
x.a[i]=i;
return x;
}
int main()
{
int b[10];
b=retArray().a;
printf("%d\n",b[5]);
/**或者这样调用
RETA y=retArray();
printf("%d\n",y.a[3]);
**/
return 0;
}
这种形式相对较安全,可以避免忘记释放指针而造成内存泄露,
也可以避免访问悬挂指针造成的错误。但缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
注意
:
(1) 在返回指针时要切记要避免内存泄露和访问悬挂指针
(2) 很多人认为指针和数组等价的,这是错误的。int (*a)[10]和int b[10]两者是不能直接用a=b来赋值的。在数组和指针作为函数参数传递时,二者可以认为等价,这是因为数组会被转化为指针来传递。
(3) 返回多维数组方法类似。
分享到:
相关推荐
当程序需要多于一个返回值时,如果只允许按值传递,会带来不便。而按引用传递参数,使得可以按需要同时返回的几个值都作为参数传递给方法,被调用的方法在其程序的内部对这些值做了修改后,调用者可以访问这些按引用...
11. 程序运行中,从键盘输入多于一个数据时,通常使用空格或回车作为分隔符,所以答案是D. 空格或回车。 12. 执行语句"a+=a*a;"后,如果a的初始值为12,a的值会变成C. 156,因为a=a*a+12等于144+12。 13. 表示代数式...
我们可以设计一个函数,接受一个 long double 参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值 123.45678 应该生成"123.45"这样的字符串。此外,函数还应该能够处理各种异常情况,如像 123.0 ...
如果数组元素数量多于初始值的数量,未指定的元素将默认初始化为零(对于数值类型)或空字符(对于字符类型)。如果初始值数量少于数组长度,剩余元素会被初始化为零。 三、访问数组元素 通过索引来访问数组元素,...
11. **程序运行中需要从键盘上输入多于一个数据时,各数据之间的分隔符** - **知识点**: 输入数据时的分隔符。 - **解析**: 当需要从键盘输入多个数据时,通常使用空格或回车键作为数据之间的分隔符。 12. **执行...
14. 输出`(a,b)`会打印b的值,因此D.26是正确答案,因为逗号运算符会返回最后一个表达式的值。 15. `x && y`的值等于x的值,因为当y为非零(即真)时,表达式的结果取决于x。因此,如果x是bool型且为真,那么`x && y...
在C++中,逻辑与运算符&&将两个表达式的值作为输入,并返回一个bool值,如果x为真,则表达式x&&y的值也为真。 16. x>0 && x的相反表达式为x|| x>10。 在C++中,可以使用逻辑或运算符||来计算相反表达式的值。 17....
17. **分程序漏掉 "{" (Compound statement missing {)**:需要一个复合语句的地方,如`if`、`for`、`while`等,忘记了打开的大括号。 18. **不明确的类型说明符 (Conflicting type modifiers)**:在同一声明中使用...
虽然这是一个有趣的特性,但它本质上仍然是一个函数调用。因此,除非重载运算符确实能让代码变得更简洁、更易于理解,否则就没有必要进行重载。编写代码时应考虑未来阅读代码的人,因为代码会被阅读的次数远远多于...
当一个函数不需要经过return语句返回一个值时,称为无返回值函数或无类型函数,此时需要使用保留字void作为类型名。 <函数名>是用户为函数所起的名字,它是一个标识符,应符合C++标识符的一般命名规则,用户经过...
14. `v.insert(v.begin(), v2.end() - 2, v2.end())`: 将容器 v2 的最后两个元素插入容器 v 的头部,返回新添加元素的第一个元素的迭代器。 15. `v.push_back(t)`: 尾部追加元素 t。 16. `v.pop_back()`: 删除尾元素...
鉴于c++支持+-+-+-1=-1,但是出现连+或连-时会报错的混乱情况,本程序允许在数字和变量前加一个+或-号用来变号,即2+-1 3*-x -3++2是支持的,但是多于一个的额外+-号将报错,即3+-+2 +-1是不支持的 ---------------...
对于多于一个盘子的情况,需要先将上面的`n-1`个盘子借助一个辅助柱子移动到目标柱子,然后将最大的盘子移动到目标柱子,最后将那`n-1`个盘子从辅助柱子通过源柱子移动到目标柱子上。这个过程会递归地重复,直到所有...
例如,返回类型为float的函数不能返回一个double类型的值,除非进行了显式的类型转换。 数据结构中,数组和线性表(如链表)的性能各有优劣。数组因为其连续存储的特点,使得访问速度快,随机访问和原地逆序操作...
1. **递归划分**:如果序列中的元素数量多于一个,则将该序列分为两个子序列,直至每个子序列只有一个元素。 2. **递归合并**:从两个子序列开始,比较两个子序列的首元素,将较小的元素放入新的序列中,并移动较小...
在计算机编程语言C和C++中,`sizeof`是一个非常重要的运算符,它用来获取一个类型或变量在内存中占据的字节数。这个运算符在编写高效且内存管理精细的程序时尤其关键。以下是对`sizeof`函数的详细解释: 1. **什么...
另一个是调用一个可以作为函数调用的Lua值. 使用函数名来调用的版本只能调用Lua全局函数. "..."代表传递给Lua函数的 可变个数的参数. 这使得你可以指定调用的策略.你可以通过 operator[] 来实现 这个功鞥.你可以同...
if (low ) { // 如果子数组包含多于一个元素 int pivotloc = Partition(L, low, high); // 对子数组进行分区操作 Qsort(L, low, pivotloc - 1); // 递归地对左子数组进行排序 Qsort(L, pivotloc + 1, high); // ...