C 函数的';返回类型';标签是什么?
我已经学习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) {
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)
使用typedeflist
声明函数的返回类型作为指向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
被定义为typelist*head
,那么它就会成功。记住编译时要打开-Wall
,或者打开等效的选项(启用“所有警告”),因为C在最好的时候非常棘手,而且很容易出错