C语言中的函数定义

C语言中的函数定义,c,function,C,Function,我不明白为什么我们在函数声明中使用* struct node *create_ll(struct node *) { body here } 为什么我们要在创建函数名之前使用*? 它被称为使用语句: start = create_ll(start); 如果这有帮助的话。 请对此进行解释。结构节点*创建(结构节点*) 表示此函数的返回类型将是struct node类型的指针。读起来像 结构节点* 不像 *创建ll 这与函数的名称无关。struct node*create\ll(stru

我不明白为什么我们在函数声明中使用*

struct node *create_ll(struct node *)
{
    body here
}
为什么我们要在创建函数名之前使用*? 它被称为使用语句:

start = create_ll(start);
如果这有帮助的话。
请对此进行解释。

结构节点*创建(结构节点*)

表示此函数的返回类型将是
struct node
类型的指针。读起来像

结构节点*

不像

*创建ll


这与函数的名称无关。

struct node*create\ll(struct node*)

表示此函数的返回类型将是
struct node
类型的指针。读起来像

结构节点*

不像

*创建ll


这与函数的名称无关。

此处*表示您正在使用指针。原因是由于节点可能包含大量变量,并且会消耗大量内存,因此为了避免这种情况,我们使用如下指针

struct Node*
因为在这种情况下,当调用函数并传递类型Node的参数或返回参数时,会节省大量内存,因为在指针中只传递或返回节点的地址。否则,在传递到函数或从函数返回之前,会在内存中创建节点的大副本(如果节点有很多变量)。 就像我带你去一家苹果商店,和你一起去买,在指针的情况下,我只告诉你商店的地址,你自己买

现在进入问题的第二部分
struct Node*
这里函数将返回struct Node类型的指针,所以要使用它,您将编写以下代码

struct Node* someInput;
sturct Node* someOutput=create_ll(someInput);
要在someOutput中使用成员,例如,如果节点中有像name和age这样的成员,您将执行以下操作

someOutput->age;
someOutput->name;

这里*表示您正在使用指针。原因是因为节点可能包含很多变量,并且会消耗大量内存,所以为了避免这种情况,我们使用如下指针

struct Node*
因为在这种情况下,当调用函数并传递类型Node的参数或返回参数时,会节省大量内存,因为在指针中只传递或返回节点的地址。否则,在传递到函数或从函数返回之前,会在内存中创建节点的大副本(如果节点有很多变量)。 就像我带你去一家苹果商店,和你一起去买,在指针的情况下,我只告诉你商店的地址,你自己买

现在进入问题的第二部分
struct Node*
这里函数将返回struct Node类型的指针,所以要使用它,您将编写以下代码

struct Node* someInput;
sturct Node* someOutput=create_ll(someInput);
要在someOutput中使用成员,例如,如果节点中有像name和age这样的成员,您将执行以下操作

someOutput->age;
someOutput->name;
正如Sourav所说(我想我会进一步阐述,由于rep值低,我无法评论),使用*运算符返回一个指向给定类型的指针,该指针实际上只是一个存储给定对象的起始内存地址的数字(数字的实际类型取决于操作系统和处理器…32位操作系统/处理器上的32位数字,64位操作系统/处理器上的64位数字)而不是实际对象本身

例如:即使您有64位处理器,如果您运行的是Windows XP(32位),则生成的数字将是32位数字(要存储的内存为4字节),如果您切换到64位操作系统,则生成的数字将是64位数字(要存储的内存为8字节)

为了首先获得指针,需要使用&运算符…除非使用malloc()或类似的方法动态分配

实际使用指针时,将使用->运算符(而不是使用.operator)

要在代码中给出一个示例:

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;
};
如果您试图在上面的代码中使用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;
    }
};
void函数()
{
//声明指针
测试对象*指针=NULL;
//声明2个实际对象
测试对象object1、object2;
//设定值
object1.value=1;
object2.value=2;
//检查指针是否没有指向任何东西
if(指针==NULL)
{
//在这个时刻,它没有指向任何东西(它仍然是空的)
//因此此代码不会运行,从而停止程序崩溃
//打印出指针指向的任何内容
库特值;
}
//将指针设置为指向object2
指针=&object2;
//检查指针是否没有指向任何东西
if(指针==NULL)
{
//现在它确实指向某个对象(除NULL以外的任何对象)
//打印出指针指向的任何内容
库特值;
}
};
如果注释掉2个If语句,那么当到达第一个COUT时,程序可能会崩溃(它应该崩溃,但并不总是如此)


我希望这能回答您的问题

,正如Sourav所说的(我想我会进一步阐述,由于rep值低,我无法评论),使用*运算符返回一个指向给定类型的指针,该指针实际上只是一个存储给定对象的起始内存地址的数字(数字的实际类型取决于操作系统和处理器…32位操作系统/处理器上的32位数字,64位操作系统/处理器上的64位数字)而不是实际对象本身

例如:即使您有64位处理器,如果您运行的是Windows XP(32位),那么生成的数字将是32位数字(4b)