Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数的';返回类型';标签是什么?_C_Function - Fatal编程技术网

C 函数的';返回类型';标签是什么?

C 函数的';返回类型';标签是什么?,c,function,C,Function,我已经学习C一个月了,我已经了解/记住函数的定义如下: return_type function_name( parameter list ) { ...body } 但是在一次关于“列表ADT”的讲座中,这个示例代码演示了如何制作和打印一个完整的列表,其中有一些代码(函数声明)的形式是我从未见过的 ... typedef struct list{ int data; struct list *next; } list; list* create_list(int d) {

我已经学习C一个月了,我已经了解/记住函数的定义如下:

return_type function_name( parameter list ) {
     ...body
}
但是在一次关于“列表ADT”的讲座中,这个示例代码演示了如何制作和打印一个完整的列表,其中有一些代码(函数声明)的形式是我从未见过的

...
typedef struct list{ int data; struct list *next; } list;

list* create_list(int d) {
     ...
}
据我所知,返回类型是'list'(?),这是一个结构标记,函数名是'*create_list'(这是一个取消引用的指针??)。我不明白为什么它是这样写的。我想知道它是如何工作的以及如何使用它。它与其他(外观正常的)函数(如
struct create_list(int d){…}
)有何不同?老师没有提到或解释这些,所以我很困惑

这是完整的代码以防万一

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

typedef struct list{ int data; struct list *next;} list;

int is_empty(const list *l) { return (l == NULL); }

list* create_list(int d) {
    list* head = malloc(sizeof(list));
    head -> data = d;
    head -> next = NULL;
    return head;
}
list* add_to_front(int d, list* h) {
    list* head = create_list(d);
    head -> next = h;
    return head;
}
list* array_to_list(int d[], int size) {
    list* head = create_list(d[0]);
    int i;
    for(i = 1;  i < size; i++) {
        head = add_to_front(d[i], head);
    }
    return head;
}

void print_list(list *h, char *title) {
    printf("%s\n", title);
    while (h != NULL) {
    printf ("%d :", h -> data);
    h = h -> next;
    }
}

int main() {
    list list_of_int;
    list* head = NULL;
    int data[6] = {2,3,5,7,8,9};
    head = array_to_list(data, 6);
    print_list(head, "single element list");
    printf("\n\n");
    return 0;
}
#包括
#包括
#包括
typedef结构列表{int data;结构列表*next;}list;
int为_空(const list*l){return(l==NULL);}
列表*创建_列表(int d){
list*head=malloc(sizeof(list));
头部->数据=d;
head->next=NULL;
回流头;
}
列表*将列表添加到前面(int d,list*h){
列表*标题=创建列表(d);
head->next=h;
回流头;
}
列表*数组到列表(整数d[],整数大小){
list*head=create_list(d[0]);
int i;
对于(i=1;idata);
h=h->next;
}
}
int main(){
清单清单清单;
列表*head=NULL;
int数据[6]={2,3,5,7,8,9};
头=数组到列表(数据,6);
打印列表(标题,“单元素列表”);
printf(“\n\n”);
返回0;
}
任何帮助都将不胜感激


如果我在某些方面错了,请纠正我。谢谢你

很接近,但读错了。函数名中没有类似于
*
的内容,只有类型才有

这定义了一个函数,该函数返回
list*
(也称为
struct list*
,这是
typedef
之前建立的)给定参数
d
类型
int

list*创建列表(int d){
// ...
}
换句话说,
create\u list
返回指向
list
的指针。在类型定义中,
*
表示指针,但它作为运算符具有不同的含义,例如:

intx=0;
int*y=&x;
*y=5;//取消对y指针的引用,进行赋值,换句话说,赋值给x
通常可以发现解引用运算符,因为它不是返回类型说明符、参数或变量声明中类型的一部分。在大多数其他情况下,它是解引用操作符

据我所知,返回类型是'list'(?),它是一个结构标记

在您的示例中,
list
既是一个struct标记,也是一个typedef名称。C的名称空间规则允许四种不同类别的标识符:

  • 标签(用于
    goto
    等)
  • struct/union/enum标记(
    struct this\u是一个\u标记
  • 结构/联合成员
  • 其他一切
将这些不同名称空间中的标识符命名为相同名称是有效的


在这个例子中

typedef结构列表{int data;结构列表*next;}list

typedef
列表
标识符在声明末尾(在
之后)才可用。但是,结构标记
struct list
是。因此,
struct list*下一步成员引用结构标记,这是创建自引用结构的方便方法。一旦声明了typedef,我们可以使用
list
来引用typedef:ed结构类型,或者我们可以使用
struct list
,这意味着同样的事情-当在结构声明之外使用时,它只是一个要使用的样式首选项

因此,
list*create\u list(int d)
使用typedef
list
声明函数的返回类型作为指向struct的指针,
list*
。按值返回任何变量与返回指向它的指针没有区别


在这种情况下,函数调用
malloc
来创建一个结构变量,因此函数需要返回一个指针,因为
malloc
分配的任何内容都是通过指针访问的。

据我所知,返回类型是'list'(?),这是一个结构标记,函数名是'*create\u list'(这是一个取消引用的指针???。
No,返回类型是
list*
,名称是
create\u list
它与其他(外观正常的)函数,如struct create\u list(int d){…}有何区别?
这不是一个正常的函数,因为它不正确。
struct
不是一个类型,
list
也是,
list*
。你可以返回一个列表或指向列表的指针,你不能返回
struct
@tkausl谢谢!但这是否意味着函数永远不能返回一个结构?(比如当我尝试在不同的情况下使用它时)您可以,但由于复制开销,它可能代价高昂且有问题,而且每次复制时它的地址都会不断更改。这就是为什么经常使用指针。这类似于声明指针变量(
int*x;
)和取消引用此变量之间的区别(
inta=*x;
)。在前一种情况下,您不是说
*x
是一个“取消引用的指针”,而是一个“指向int的指针”。谢谢!这是否意味着[list*create_list(intd){…return head;}]中的“return head;”返回值(我相信是指针值)要“list*”?是的,如果
head
被定义为type
list*head
,那么它就会成功。记住编译时要打开
-Wall
,或者打开等效的选项(启用“所有警告”),因为C在最好的时候非常棘手,而且很容易出错