gpt4 book ai didi

c - 在 void 函数中通过引用而不是值传递结构

转载 作者:行者123 更新时间:2023-11-30 18:27:56 25 4
gpt4 key购买 nike

我正在尝试使用结构和函数创建联系人列表。目前我的代码可以编译,但结构的成员没有像我试图做的那样在函数之外进行修改。这是我的代码(删除了一些长度的行)

#include <stdio.h>
#include <stdlib.h>

struct ContactInfo
{
char fname[50];
char lname[50];
};

struct ContactInfo gc;

void getContactInfo(struct ContactInfo gc)
{
printf("First Name: ");
scanf("%s", gc.fname);

printf("\nLast Name: ");
scanf("%s", gc.lname);
}

void showContactInfo(struct ContactInfo gc)
{
printf("* First Name: %s \n", gc.fname);

printf("* Last Name: %s \n", gc.lname);
}

int main()
{
getContactInfo(gc);

showContactInfo(gc);

return 0;
}

最佳答案

对于getContactInfo,您需要传递一个指向结构的指针:

void getContactInfo( struct ContactInfo *gcptr )
{
printf("First Name: ");
scanf("%s", gcptr->fname);

printf("\nLast Name: ");
scanf("%s", gcptr->lname);
}

由于您尝试修改内容gc,因此需要将指向它的指针传递给函数。请记住,C 按值传递所有参数,因此被调用的函数会创建一个单独的重复对象来接收参数的值。您的代码正在修改该重复对象,这对实际参数没有影响。

当操作数是指向 structunion 类型的指针时,使用 -> 运算符 - 它在访问之前隐式取消引用指针特定成员。它相当于编写 (*gcptr).fname(*gcptr).lname,同时更方便一些。

您可以将此函数称为

getContactInfo( &gc );

对于 showContactInfo,您可以保留原样,因为您不尝试修改参数。但是,很多人喜欢将指针传递给 struct 来节省内存(您不会在被调用函数中构建 struct 的副本)。如果您想使用指针,我建议使用 const 关键字,如下所示:

void showContactInfo( const struct ContactInfo *gcptr )
{
printf("* First Name: %s \n", gcptr->fname);
printf("* Last Name: %s \n", gcptr->lname);
}

如果我尝试修改 gcptrshowContactInfo 中指向的对象的内容,const 关键字会告诉编译器对我大喊大叫功能。就像上面的 getContactInfo 一样,您可以将其称为

showContactInfo( &gc );

请注意,我将参数名称更改为 gcptr 只是为了帮助区分函数定义中的形式参数和函数调用中的实际参数。我通常不喜欢在变量或参数名称中放入任何类型信息,但您可以使用您喜欢的任何命名约定。

关于c - 在 void 函数中通过引用而不是值传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51163142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com