如何在c中返回字符(*)[6]?

如何在c中返回字符(*)[6]?,c,arrays,function,pointers,multidimensional-array,C,Arrays,Function,Pointers,Multidimensional Array,我想按字母顺序对字符串数组(即c中的字符数组)进行排序。以下是我的函数体:- char (*)[6] sort_strings ( char (*sptr) [6]) { //code. //return a pointer of type char (*)[6]. } 但编译器无法识别此类型的返回类型。它会给出错误提示:- 应为标识符或“(”之前“)”标记 那么,如何返回char(*)[6]类型的指针呢?我还有一个问题,首先看一下main(),如下所示:- int m

我想按字母顺序对字符串数组(即c中的字符数组)进行排序。以下是我的函数体:-

char (*)[6] sort_strings ( char (*sptr) [6])
{

     //code.
     //return a pointer of type char (*)[6].

}
但编译器无法识别此类型的返回类型。它会给出错误提示:-

应为标识符或“(”之前“)”标记

那么,如何返回char(*)[6]类型的指针呢?我还有一个问题,首先看一下
main()
,如下所示:-

int main(){

    char names[5][6] = {

            "tom",
            "joe",
            "adam"
    };

    char (*result)[6] = sort_strings (names);

    //code for printing the result goes here.

    return 0;
}
所以我的下一个问题是,当我调用
排序字符串(名称)
时,编译器也会给我警告:-

初始化使指针从整数变为不带强制转换的整数

因此,我的问题是:-

1.如何从函数返回字符(*)[6]

2.为什么编译器在我调用此函数时给我警告


我在windows上的代码块上运行此代码。

如果您坚持对一个由6个字符串组成的数组进行排序,您可以将其打包到一些
结构中,如

 struct sixstrings_st {
    char* ptrarr[6];
 };
但是,您可能希望对任意数量的字符串进行排序。然后,您可以将该数字作为另一个形式参数传递(您也可以使用其他约定,例如将数组大小存储在某个全局变量中,但这很难看):

或者你可以使用

顺便说一句,不要重新发明排序,使用

此外,出于可读性的目的,您通常不希望有复杂的外观类型。使用
typedef
,并根据需要定义尽可能多的
struct
(可能使用
union
-s)

使用数组时要小心。在许多情况下(尤其是传递给函数的参数),数组会衰减为指针(请注意,处理器通常不会在一条机器指令中同时处理整个数组)。函数不能真正返回数组,只能返回指针(或某些
struct

在C编程中,函数返回标量数据(例如整数或某个指针)是很常见的。返回一个<代码>结构> <代码>并不常见(相反,C++返回一个<代码>类< /COD>实例是常见的)。当您返回一个
结构时,您通常希望它“足够小”(否则函数return在概念上会复制很多字节)。顺便说一句,一些-s可能有特定的规则来返回两个标量元素的
结构。对于Linux,带有两个整数或两个指针的
struct
通过两个机器寄存器返回

通常,函数是返回指针(可能是通过
malloc
获取并填入函数),您应该定义一个约定并记录对返回指针应该做什么,特别是谁负责
释放它以及如何使用它。C编程中的一个常见习惯用法是定义创建函数
foo\u create
,这些函数分配一个复杂的数据结构
struct foo\u st
(通常通过为某些
struct
调用
malloc
,为其组件调用其他创建函数)并返回指向它的指针,以及销毁函数
foo\u destroy
,该函数正在销毁此类数据结构(通常是通过销毁组件,然后调用
free
,对作为
struct foo\u st*
指针传递的整个结构进行调用)

通常,在C中,您希望避免在函数之间传递或返回大的(例如大的
struct
-s、数组、
union
-s等)(避免大量数据被复制,因为C是。因此,您可以谨慎地使用指向它们的指针:避免和。因此,您不返回已排序的数组,而是返回指向该数组的指针(并记录应该销毁该数组的人员、方式和时间)。。。了解甚至了解(至少要了解术语和基本技术,如)


最后,您通常不希望在源代码中硬编码6这样的大小。您应该希望处理任意(但合理)大小的任意字符串数组。如果您需要硬编码一个大小,至少给它一些可读的名称,例如使用
\define MY_WEIRD_size 6
和code
MY_WEIRD_size
在适当的位置而不是6…

函数声明看起来像变量声明,只是变量名被函数名和参数替换。因此:

// asdf is a pointer to an array of 6 chars
char (*asdf)[6];

// sort_strings is a function returning a pointer to an array of 6 chars
// (and with an argument which is a pointer to an array of 6 chars)
char (*sort_strings ( char (*sptr)[6] )) [6];

@超越性等同于char(/*)[6]。我认为这种表示法最终会退化为char(/*)[6],是吗?请注意,
char(*)[6]
不是指向字符串数组的指针。@Rouftantical我不太确定,但为什么不将数组传递给函数,然后在里面排序呢。实际上不需要返回2D字符数组,除非您希望这样。@immibis,但它是指向6个字符数组的指针。immibis比我先找到答案,但在测试时,我注意到名称
clarke
实际上需要7个字符,而不是6个字符,由于NUL终止符。请详细解释您的上一个符号。以及为什么编译器在语法方面不接受函数体?函数声明按照您的建议工作,但编译器给出了相同的错误。请详细解释发生了什么。哦,抱歉!那是我的错!它是有效的,但如果你能详细解释一下它是如何工作的,那会更有帮助,因为你写的函数声明工作得很好,但看起来很棘手。解释很简单:这就是C的语法定义。是的,字符**可以工作,但为什么我的符号不工作,因为C就是这样设计的(因为从历史上看,C是设计为接近硬件的,硬件不会在一条机器指令中处理整个阵列)在C++中,您可以使用<代码> STD::数组在结构实例中,将指针返回到Strut是很好的。不总是,C允许返回<代码> Stutt,并且有很多有用的例子,请您解释一下其他答案。
// asdf is a pointer to an array of 6 chars
char (*asdf)[6];

// sort_strings is a function returning a pointer to an array of 6 chars
// (and with an argument which is a pointer to an array of 6 chars)
char (*sort_strings ( char (*sptr)[6] )) [6];