为结构变量赋值
Posted
技术标签:
【中文标题】为结构变量赋值【英文标题】:Assign values to structure variables 【发布时间】:2015-12-18 08:01:42 【问题描述】:结构类型定义为:
typedef struct student
int id;
char* name;
double score;
Student;
我构造了一个 Student 类型的变量,我想给它赋值。我怎样才能有效地做到这一点?
int main()
Student s1;
int id = 3;
char* name = getName(id);
double score = getScore(id);
/*Error
s1 = id, name, score;
*/
/* Can I avoid assigning values individually?
s1->id = id;
s1->name = name;
s1->score= score;
*/
return 0;
【问题讨论】:
除非我不明白这个问题,否则这是一个“C 基础学习”问题,应该通过简单地了解 C 结构是什么以及如何使用它们来自行回答。然而,您正在谈论使用唯一 ID 访问结构实例。然后您还应该看到那个“C 指针”是什么。 【参考方案1】:在 C99 标准中,您可以使用复合文字来赋值:
Student s1;
s1 = (Student).id = id, .name = name, .score = score;
【讨论】:
我不敢相信直到 2017 年 5 月 10 日才有人给出这个答案。 那么如果不指定所有参数会怎样呢?例如,假设 s1 已经初始化,并且您想要覆盖名称和分数,而不是 id。你能说s1 = (Student) .name = name, .score = score
吗?还是会以某种方式覆盖 id ?这种行为是否可移植?
@gabeappleton 结构赋值总是用右侧的数据替换左侧结构。示例的右侧是带有指定初始化程序的结构,默认情况下,缺失的字段将被初始化为零。然后 s1 将被新结构的内容替换。所以 id 字段将被设置为零。
@BobtheMagicMoose “个人作业”这里是 designated initializers
。在您的示例中,它是 value initializer
之外的另一种初始化程序。使用指定的初始化器,我们可以省略某些字段的值。并且这样的初始化器允许区分 struct init 和数组 init,它们在值初始化器的情况下是相似的。在@jerico 链接中,结构示例中也有指定的初始化器。
您可以根据需要使用任何初始化程序类型。 C 标准允许这两者。【参考方案2】:
注意,结构和指向结构的指针是两个不同的东西。
C 为您提供:
结构初始化(仅在声明时):
struct Student s1 = 1, "foo", 2.0 , s2;
结构复制:
struct Student s1 = 1, "foo", 2.0 , s2;
s2 = s1;
直接元素访问:
struct Student s1 ;
s1.id = 3;
s1.name = "bar";
s1.score = 3.0;
通过指针操作:
struct Student s1 = 1, "foo", 2.0 , s2, *ps3;
ps3 = &s2;
ps3->id = 3;
ps3->name = "bar";
ps3->score = 3.0;
初始化函数:
void initStudent(struct Student *st, int id, char *name, double score)
st->id = id;
st->name = name;
st->score = score;
...
int main()
...
struct Student s1;
iniStudent(&s1, 1, "foo", 2.0);
...
从这些(或其他尊重 C 标准)中挑选,但 s1 = id, name, score;
只不过是一个语法错误;-)
【讨论】:
【参考方案3】:我可以避免单独赋值吗?
如果这些值已经是类似struct
的一部分,您可以这样做,也就是说,您可以这样做:
Student s1 = .id = id, .name = name, .score = score;
创建Student
的实例并初始化您指定的字段。这可能并不比单独分配值更有效,但它确实使代码保持简洁。一旦你有一个现有的Student
实例,你可以通过简单的赋值来复制它:
Student s2;
s2 = s1; // copies the contents of s1 into s2
如果这些值都在单独的变量中,并且您没有初始化 Student
,那么您可能需要单独分配这些值。不过,您始终可以编写一个为您执行此操作的函数,这样您就有了类似的东西:
setupStudent(s3, id, name, score);
这将使您的代码保持简短,确保每次都以相同的方式填充结构,并在 Student
的定义发生变化时(而不是如果)简化您的生活。
【讨论】:
以上是关于为结构变量赋值的主要内容,如果未能解决你的问题,请参考以下文章