《C语言参悟之旅》新鲜试读(连载4)

 
9.1.6 结构体变量的初始化
和C语言中其它变量一样,在定义结构体变量时可以进行初始化操作,一般形式为([]中的内容表示可省略):
struct [结构体类型名]
{
数据类型名1    成员名1;
… …
数据类型名n    成员名n;
}结构体变量 = {初始数据};
例如,可以在定义hero型变量wusong时对其进行初始化:
struct hero
{
int number;            //排名
char sex;              //性别
char star_name[20];     //星名
char name[20];          //名称
char nickname[20];      //绰号
char position[20];      //职业
char weapon[20];        //使用武器
} wusong={14,’m’,”天伤星”,”武松”,”行者”,”步兵头领”,”2把戒刀”};       
//定义了结构体变量wusong并初始化。
定义结构体变量wusong但没有初始化时,编译器会给每个成员一个默认值,初始化后就赋予初始化时地赋值,如图9.4所示:
              
                       图9.4 结构体变量及其初始化
注意:对结构体变量进行初始化时,必须按照每个成员的顺序和类型一一对应地赋值,少赋值、多赋值,以及类型不符都可能引起编程错误。
9.1.6 结构体变量的引用
在定义了结构体变量后,就可以引用这个变量。所谓引用结构体变量就是使用结构体变量或结构体变量的成员进行运算或者其他操作。
1. “.”运算符
在C语言中,“.”也是一个运算符,叫做成员运算符。一般和结构体或共用体变量名称一起使用,用来指定结构体或共用体变量的成员。例如:
linchong.nickname;
用来指定结构体变量linchong的成员nickname。
2. 结构体变量成员的引用
C语言允许引用结构体变量的成员完成某种操作。其一般形式为:
结构体变量名.成员名
例如,对于上面定义的结构体变量wusong,可这样引用其成员:
wusong.number,wusong.sex;     //应用结构体变量
wusong.number+1;                     //对结构体进行运算
printf(“%d/n”, wusong.number);   //输出构体成员的值
也可对定义了的结构体变量的成员赋值:
sunerniang.number=103;
sunerniang.nickname=”母夜叉”;
3. 整个结构体变量的引用
C语言允许对两个相同类型的结构体变量之间进行整体赋值。例如,下面将wusong的值赋给与其类型相同的变量zhangsan:
zhangsan=wusong;
9.1.7 引用结构体变量注意事项
在引用结构体变量时,需注意以下几点:
l 必须先定义结构体变量,才能对其进行引用。
当开发大型程序时,引用未定义的结构体变量而引起的错误可能会时常出现,不过,幸运的是,编译器会发现此错误,程序将无法编译通过。但是,养成良好的编程习惯还是必须的,毕竟调试错误也是一件很麻烦的事情。
l 如果一个结构体变量的成员又是一个结构类型,引用时要用成员运算符逐级遍历到最低层的成员。
例如,下面对前面定义的hero类型变量wusong的成员death_day的结构体成员进行引用:
wusong.death_day.month
wusong.death_day.day
wusong.death_day.year
其中,wusong为第一级的结构体变量名,death_day既为wusong的成员,又为第二级结构体变量名,month,day,year为death_day的成员。
l 结构体变量成员可以像普通变量一样参与各种运算或其他操作。例如:
songerniang.sex=’w’;              //对结构体变量成员进行赋值操作
songerniang.number++;             //对结构体变量成员进行自增运算
sunerniang.number>wusong.number;   //比较两个结构体变量成员
l 可以引用结构体变量地址,也可以引用结构体变量成员的地址。
例如,下面都是合法的语句:
//以十六进制数的形式输出结构体变量wusong的地址
printf(“%x”,&wusong);
//以十六进制数的形式输出结构体变量wusong成员number的地址
printf(“%x”,&wusong.number);
//从键盘输入字符给sunerniang变量的成员sex赋值
scanf(“%c”,&sunerniang.sex);
l 不能对结构体变量整体进行诸如输入输出的操作。
例如,下面的语句是非法的:
scantf(“%d%c%s%s%s%s%s”,&sunerniang);
l 结构体成员名可以与程序中的变量名相同,但两者是完全不同的两个变量。
例如,下面的程序清单说明了局部变量和结构体中的成员变量可以同名,但不代表同一个变量:
//声明结构体类型
struct hero
{
int number;            //排名
char sex;              //性别
char star_name[20];     //星名
char name[20];          //名称
char nickname[20];      //绰号
char position[20];      //职业
char weapon[20];        //使用武器
};
 
void  main()
{
    int number=100;        //局部变量
    struct hero sunerniang;
    sunerniang.number=103; //结构体成员
}
此程序中两个同名的变量如图9.5所示:
               
                         图9.5 同名的不同变量  
 

 

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值