struct Person *person_create(char *name, int age, int height, int weight)
{
struct Person *who = malloc(sizeof(struct Person));
assert(who!=NULL);
who->name=strdup(name);
who->age=age;
who->height=height;
who->weight=weight;
return who;
}
我正在 http://c.learncodethehardway.org/book/ex16.html 上浏览 ex16,我不完全确定我是否理解这段代码。
据我所知,逐行,此代码执行以下操作:
声明返回
Person
的函数,该函数接受参数*name
、age
、height
和weight
。声明一个类型的指针
Person
指向内存部分顶部的指针,该指针的大小足以容纳Person
类型的结构。查看指针并确定它是否为
NULL
类型。分配内容。
将
who
指针返回到main()
,以便事情可以发生。
老实说,我不明白为什么main()
可以通过who
以外的名称访问此结构。指针是如何传递的?还是指针以某种方式全局?或者,我是不是想多了?
只是一个数字。 它是一个内存地址。
假设你在一张纸上写下你家的地址,把那张纸放在信封里,在外面写下"谁"。然后,你把它交给别人,那个人把它放在另一个信封里,在信封外面写一些不同的东西。
您的实际地址不会改变。 你家的东西不会改变。
在 C 代码中也是如此。 您将malloc
返回的内存地址放在一个名为 who
的变量中(类似于我们的"信封")。 然后,您正在修改地址指向的内存中的某些内容。 然后,您将地址返回给可以将其放入具有完全不同名称的完全不同的变量中的人。
- 声明返回 Person 的函数,该函数接受参数 *姓名,年龄,身高和体重。
该函数不返回Person
。它返回指向Person
的指针。这些论点是name
的、age
的和weight
的,而不是*name
的。*name
中的星号表示参数name
是指针类型;它不是参数名称的一部分。
- 查看指针并确定它是否为 NULL 类型。
NULL
不是指针类型。指针who
是指向struct person
的指针。在这里,我们正在确定指针值是否为 NULL
.
请注意,如果没有可用内存,strdup()
可以返回NULL
,就像 malloc()
一样。代码可能也应该检查这一点。
至于指针是如何传递到 main 的:你把它从person_create()
返回到 main()
,所以main()
可以选择如何访问它。 main()
可以做这样的事情:
/* ... */
struct Person *new_person = create_person(...);
/* Use new_person->age, etc. */
关键是,main()
可以自由选择它想要给person_create()
返回的任何内容起的名字。你里面有什么并不重要 person_create()
,因为一旦你返回,局部变量名就会被销毁。