C中的函数定义

时间:2014-10-30 10:06:06

标签: c function

我无法理解为什么我们在函数声明中使用*,如:

struct node *create_ll(struct node *)
{
    body here
}

为什么我们在创建函数名称create_ll之前使用*? 并使用语句调用它:

start = create_ll(start);

如果这可能会有所帮助。 请解释一下。

4 个答案:

答案 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 *);