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()函数对数组进行初始化。需要注意的是,这种方式实现的只是对字符数组的初始化。