我无法理解为什么我们在函数声明中使用*,如:
struct node *create_ll(struct node *)
{
body here
}
为什么我们在创建函数名称create_ll之前使用*? 并使用语句调用它:
start = create_ll(start);
如果这可能会有所帮助。 请解释一下。
答案 0 :(得分:3)
struct node *create_ll(struct node *)
表示此函数的返回类型是struct node
类型的指针。读它像
struct node *
,
不喜欢
*create_ll
。
这与该功能的 NAME 无关。
答案 1 :(得分:1)
正如Sourav所述(我认为我进一步详细说明,由于低代表我无法评论),使用*运算符会将指针返回给定类型,这个指针实际上只是一个存储给定对象的起始内存地址的数字(实际的数字类型取决于OS和处理器...... 32位OS /处理器上的32位数字,64位OS /处理器上的64位数字)和不是实际的对象本身。
例如:即使你有64位处理器,如果你正在运行Windows XP(32位),那么结果数字将是一个32位数字(4个字节的存储空间),如果你切换到a 64位操作系统然后得到的数字将是一个64位数字(存储8个字节的内存)。
为了获得指针,首先是&需要运算符...除非使用malloc()或类似的东西动态分配。
当实际使用指针时,则 - >使用运算符(而不是使用。运算符)。
在代码中给出一个例子:
struct test_object
{
unsigned int value;
};
void function()
{
// Declare a POINTER to an object of type <test_object>
test_object *pointer;
// Declare 2 temporary objects
test_object object1, object2;
// Set object1's value using the . operator
object1.value = 1;
// Set object2's value using the . operator
object2.value = 2;
// Set the pointer to point at object2
// Note the usage of the & operator
pointer = &object2;
// Print out whatever the pointer points to (in this case object2)
// Note the usage of -> instead of .
// This is how pointers access the object being pointed at
cout << pointer->value;
// Now set the pointer to point at object1
pointer = &object1;
// Print out whatever the pointer points to (in this case object1)
// Note this is the EXACT same line used above
// but the end result is completely different
cout << pointer->value;
};
警告,如果使用不正确,指针可能非常危险。在上面的例子中,当我声明它时,我没有初始化指针...
IE:
test_object *pointer = NULL;
如果您尝试在上面的代码中使用COUT行而不先设置指针,那么可能会发生非常糟糕的事情(程序崩溃,访问错误的内存位置会产生意外结果等)。
避免此类事情的最佳方法是始终将指针初始化为NULL,并且始终在实际尝试访问指向的内存之前检查指针是否为NULL ...
重新使用上述代码,但要更安全:
void function()
{
// Declare the pointer
test_object *pointer = NULL;
// Declare the 2 actual objects
test_object object1, object2;
// Set values
object1.value = 1;
object2.value = 2;
// Check if pointer isn't pointing at anything
if (pointer == NULL)
{
// At this moment in time, it doesn't point at anything (it's still NULL)
// So this code WON'T run, which stops the program crashing
// Print out whatever the pointer points to
cout << pointer->value;
}
// Set the pointer to point at object2
pointer = &object2;
// Check if pointer isn't pointing at anything
if (pointer == NULL)
{
// Now it DOES point to something (anything other than NULL)
// Print out whatever the pointer points to
cout << pointer->value;
}
};
如果你注释掉2个if语句,那么程序可能会在第一个COUT到达时崩溃(它应该崩溃,但并非总是如此)。
我希望这能回答你的问题
答案 2 :(得分:0)
这里*意味着你正在使用指针。原因是因为Node可能包含很多变量并且会占用大量内存所以为了避免这种情况,我们使用像
这样的指针struct Node*
因为在这种情况下,当调用函数并传递参数或返回Node类型的参数时,你会节省大量的内存,因为在指针中只传递或返回Node的地址。否则大的副本(如果Node有很多变量)在传递给函数或从函数返回之前,节点将在内存中生成。 就像我带你去苹果商店并和你一起去购买它们一样,我只告诉你商店的地址并自己购买。
现在问题的第二部分struct Node*
这里函数将返回struct Node类型的指针,因此要使用它,您将编写以下代码。
struct Node* someInput;
sturct Node* someOutput=create_ll(someInput);
并在someOutput中使用成员,例如,如果Node中有名称和年龄等成员,您将执行以下操作
someOutput->age;
someOutput->name;
答案 3 :(得分:0)
你的函数正在返回一个指针。 在这种情况下,它返回一个struct node类型的指针。
所以函数原型看起来像
struct node *func(struct node *);