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
以外的名称访问此结构。指针是如何通过的?或者指针全局某种程度?
或者,我在想这个吗?
答案 0 :(得分:3)
指针只是一个数字。这是一个内存地址。
假设你在一张纸上写下你家的地址,把那张纸放在信封里,然后在外面写下“谁”。然后,你把它交给别人,那个人把它放在一个不同的信封里,并在信封的外面写了一些不同的东西。
您的实际地址不会改变。你房子的内容不会改变。
这里是相同的,在C代码中。您将malloc
返回的内存地址放在一个名为who
的变量中(类似于我们的“信封”。)然后,您正在修改地址所指向的内存中的内容。然后,您将地址返回给可以将其放入完全不同的变量且名称完全不同的人。
答案 1 :(得分:2)
- 声明返回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()
内的内容并不重要,因为一旦你返回,就会销毁局部变量名。