6.2 结构体变量的初始化方法及引用

前面的代码中已经多次用到了结构体,但是并没有细讲结构体变量的初始化方法和如何引用结构体成员,接下来针对这两方面进行介绍。

6.2.1 结构体的初始化

先来看下面的一段代码。


include<stdio.h>

struct stu{

char name[10];

char num[10];

double score;

char sex[4];

int age;

};

void main()

{

struct stu per={

"小明",

"21009012",

456.9,

"男",

22,

};

printf("name:%s\nnum:%s\nscore:%lf\nsex:%s\nage:%d\n",

per.name,per.num,per.score,per.sex,per.age);

return;

}


运行结果:


name:小明

num:21009012

score:456.900000

sex:男

age:22


在上面的代码中,初始化方法是根据结构体中成员定义的先后顺序进行赋值。如果不知道结构体成员的先后顺序情况,那么就不能采用这种方法了,例如,对于封装好的结构体,在知道结构体成员类型而不知道先后顺序的情况下,一般采用下面的这种初始化方法。


include<stdio.h>

struct stu{

char*name;

char*num;

double score;

char*sex;

int age;

};

void main()

{

struct stu per;

per.name="王梅梅";

per.age=21;

per.sex="女";

per.sex="fd";

per.num="20204";

per.score=765.9;

printf("name:%s\nnum:%s\nscore:%.3lf\nsex:%s\nage:%d\n",

per.name,per.num,per.score,per.sex,per.age);

return;

}


运行结果:


name:王梅梅

num:20204

score:765.900

sex:fd

age:21


采用上面这种方式同样可以实现对结构体变量的初始化。细心的读者会发现一个问题,在上面的代码中把前面结构体中的数组类型变成了指针类型。为什么不采用数组类型呢?如果把上面结构体中的指针类型还原为最初的数组类型,而且还采用上面的初始化方式,会出现什么情况呢?为了重点讲解指针与数组的区别,修改上面的代码如下。


include<stdio.h>

struct stu{

char name[10];

};

void main()

{

struct stu per;

per.name="张晓笑";

printf("%s\n",per.name);

return;

}


上面的代码在编译时出现了“error C2440:'=':cannot convert from'char[7]'to'char[10]'”错误,为什么会出现这样的错误呢?在对结构体中的名字进行初始化的过程中,一个汉字占2字节,最后还有一个结束符‘\0’,共占用7字节,是不是只要修改结构体中name成员的数组长度为7就可以了呢?将其修改为7后,再次编译时出现了“error C2106:'=':left operand must be l-value”错误,这是什么原因呢?这种错误归根于对数组的初始化方式不清楚。在讲解字符数组的初始化方式时特地强调过,不能在定义数组后再对数组名进行一次性字符串赋值,而指针可以采用这种方式进行初始化。为了加深理解,在此不妨再通过一段代码对指针和数组的字符串初始化进行比较。


include<stdio.h>

void main()

{

char*namep;

namep="范德萨";

char name[10]="张欣欣";

//name="张欣欣";切记不可采用这样的初始化方式

printf("%s\n",namep);

printf("%s\n",name);

return;

}


运行结果:


范德萨

张欣欣


那么,是不是不能将结构体的成员变量定义为数组类型呢?当然不是,如果将结构体的成员变量定义为数组类型,那么可以利用strcpy()函数对其进行初始化,例如:


include<stdio.h>

include<string.h>

struct stu{

char name[10];

char num[10];

double score;

char sex[4];

int age;

};

void main()

{

struct stu per;

strcpy(per.name,"小明");

strcpy(per.num,"21009012");

strcpy(per.sex,"男");

per.score=456.9;

per.age=22;

printf("name:%s\nnum:%s\nscore:%lf\nsex:%s\nage:%d\n",per.name,per.num,per.score,per.sex,per.age);

return;

}


运行结果:


name:小明

num:21009012

score:456.900000

sex:男

age:22


从上面的运行结果可以看出,如果结构体中存在数组类型的成员,可以利用strcpy()函数对数组进行初始化。需要注意的是,这种方式实现的只是对字符数组的初始化。