《C专家编程》:函数如何返回一个数组
下面几种函数的写法都是等价的:
加不加*号,加多少*号,都是一样的。
《C专家编程》里说:这是一个在ANSI C中流行的不良方法,即调用函数和通过指针调用函数(或任意层次的指针间接引用)使用同一种语法。至于数组,也有对应的方法。这种做法进一步恶化了本来就有缺陷的“声明与使用相似”的设计哲学。
C语言函数能返回一个二维数组吗
1、函数不能返回一个数组,只能返回一个变量,或地址 。如果你想直接返回一个二维数组,这是做不到的。可以用下面的方法 ,先建一个结构体。
struct array{int a[3][3];}; array solve(){array a;return a;} 通过这种方法,来得到二维数组。
2、数组在作为函数返回值或者函数参数时,实际上只作为指针来返回或者传递的。因此返回值用指针数据类型。
比如下面的代码:
int g_a[4] = {1,2,3,4};int * retn_arrary() //返回值用指针类型即要。{return g_a; }
c语言函数怎么传入数组
传入数组地址。
在函数的参数部分传入数组的地址,新建一个数组,int abc[10] ={1,2,3,4,5,6,7,8,9,10};有函数int adddata(int *buf){int a = 3;return a+buf[2];}将数组的地址传入函数。
这时只要将数组的地址abc传入函数即可运用数组的数据,int b =adddata(abc);函数的返回值就是3+2=5,即b=5。
函数的三种返回方式
1.无返回值的函数
只有返回类型是 void 的函数。
可以不使用 return 语句,会隐式地执行。若想在中间位置提前退出,可以使用 return 语句。可以使用 return 语句返回另一个返回 void 类型的函数。
2.有返回值的函数
在含有 return 语句的循环后面应该也有一条 return 语句。
(1)值是如何被返回的:
返回一个值的方式和初始化一个变量或形参的方式完全一样:返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。
(2)不要返回局部对象的引用或指针:
函数完成后,它所占的存储空间也随之被释放掉,因此函数终止意味这局部变量的引用将指向不再有效的内存区域。
想要确保返回值安全,我们不妨提问:引用所引的是在函数之前存在的哪一个对象。
(3)调用运算符的优先级与点运算符和箭头运算符相同,如果函数返回指针、引用或类的对象,可以使用函数调用的结果访问结果对象的成员。
(4)调用一个返回引用的函数得到左值,其他返回类型得到右值。
(5)函数可以返回花括号包围的值的列表,用来对表示函数返回的临时量进行初始化。
(6)主函数 main 的返回值:
允许没有 return 语句直接结束,编译器将隐式地插入一条返回 0 的 return 语句。
main 函数的返回值可以看作是状态指示器,返回 0 表示执行成功,返回其他值表示执行失败,其中非零值的具体含义依机器而定。可以使用 cstdlib 头文件中定义的两个预处理变量,EXIT_FAILURE 和 EXIT_SUCCESS 分别表示成功和失败。
(7)函数可以调用自身,成为递归函数。在递归函数中,一定有某条路径是不包含递归调用的,否则函数将不断地调用它自身知道程序栈空间耗尽为止。
3.返回数组指针:
因为数组不能被拷贝,所以函数不能返回数组,但可以返回数组的指针或引用。
int (*func(int i) [10]; // 声明一个返回指向大小为 10 的整型数组指针的函数
1
1
简化的方式有三种:
(1)使用类型别名;
(2)使用尾置返回类型;
(3)使用 decltype,注意 decltype 不负责将数组类型转换成指针类型。

