为结构变量赋值

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 的定义发生变化时(而不是如果)简化您的生活。

【讨论】:

以上是关于为结构变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

为结构变量动态赋值

C语言关于结构体变量为动态数组赋值问题

变量的结构赋值

无法通过指针 [C] 为结构的变量赋值

变量的结构赋值

在C语言中.结构体变量之间可以相互赋值吗