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)