简单结构与复杂结构
简单结构
结构是一个变量或多个变量的集合,集合有一个单独的名称,便于操作,结构可以和储存不同类型的变量,结构中的变量成为结构的成员。
声明和定义结构
如果要编写一个图形程序,就要处理屏幕上的坐标,可以声明一个坐标
变量,包含
x与y的位置。
struct coord //struct表明结构声明的开始,struct关键字后面必须是结构名,结构名也叫标签tag
{
int x;
int y;
}first,second;//声明两个coord类型的结构变量,first和second都是coord类型的实例
在实例化一个结构体时,可以通过声明与实例结合在一起;也可以通过分离方法,在通过分离实例化时,要在前面声明清楚结构体标签
struct coord first,second;
访问结构的成员,使用.
运算符,first.x=50
结构可以通过简单的阿赋值表达式在相同类型的结构间拷贝信息。
复杂结构
包含结构的结构
假设图形程序需要处理矩形,可以通过两个对角定义矩形,因此可以声明一个矩形结构。
struct refctangle{
struct coord topleft;
struct coord bottomrt;
};//一定要注意结尾的分号!!!!
包含数组的结构
struct data{
short x[4];
char y[10];
};//注意结尾一定要有分号!!!!!
结构数组
如定义一个电话薄,要包括姓和名以及电话号码,
struct entry{
char fname[10];
char lanme[12];
int phone[12];
};
struct entry list[100]; //定义了一个数组,每个元素都是一个entry结构,
初始化结构
struct sale{//声明一个结构,名字为sale
char customer[20];
char item[20];
float amount;
}mysale = {//声明一个sale结构的实例,名为mysale
"Acme Industries",//把mysale.customer初始化为字符串“Acem……
"Left-handed widget",//把mysale.item初始化为字符串“Left-……
100.00//把mysale.amount初始化为100.00
};
结构与指针
将指针作为结构的成员,
struct data{//定义data结构
int *value;
int *rate;
}first;//实例化结构实例first
first.value = &cost;//为实例first的value指针初始化,
first.rate = &interest;//为first的rate指针初始化,
*first.value;//指针value的值,
*first.rate;
指向结构的指针
常用于链表
struct part{
short number;
char name[10];
};
struct part *p_part;//创建一个指向part类型的指针。不是一个part类型的实例。
struct part data[100];//创建一个实例对象,结构数组data;
p_part = &data[0];//使将实例化的数组第一个元素地址复制给指针变量。也可以写成下面的形式
p_part = data;//数组名就是数组首地址。
/*如何使用指向结构的指针*/
(*p_part).number = 10;//之所以加括号,是因为.运算符的优先级高于*
在声明一个指向结构类型的指针,但是指针并没有初始化,不能够直接使用,
声明不一定时定义,在内存中为数据对象预留储存空间的声明才是定义,
因为指针要指向一个内存地址,因此必须先定义一个part类型的实例,然后使指针指向这个实例,
间接成员运算符,也叫结构指针运算符,通过指向结构的指针访问成员的另一种方法是通过间接成员运算符->
如要通过p_part
指针访问,如p_part->number
将结构实参传递给函数
#include <stdio.h>
struct data{
float amount;
char fname[30];
char lname[30];
}rec;
void print_rec(struct data displayRec);
int main(void){
printf("enter the donor first name and last name\n");
printf("separated by space:");
scanf("%s %s", rec.fname,rec.lname);
printf("\nenter the donation amount:");
scanf("%f",&rec.amount);
print_rec(rec);
return 0;
}
void print_rec(struct data displayRec){
printf("\nDonor %s %s gave $%.2f.\n",displayRec.fname,displayRec.lname,displayRec.amount);
}
联合
联合与结构相似,声明方法是一样的,区别是联合使用关键词 union关键字,联合在同一时间只能够储存一个值在访问时也只允许访问储存的值,否者会产生无法预知的结果。
联合的实用用法
#include <stdio.h>
#define CHARACTER 'C'
#define INTEGER 'I'
#define FLOAT 'F'
struct generic_tag{
char type;
union shared_tag{
char c;
int i;
float f;
}shared;
};
void print_function(struct generic_tag generic);
int main(void)
{
struct generic_tag var;
var.type = CHARACTER;
var.shared.c = '$';
print_function(var);
var.type = FLOAT;
var.shared.f = (float) 12345.67890;
print_function(var);
var.type = 'X';
var.shared.i = 111;
print_function(var);
return 0;
}
void print_function(struct generic_tag generic){
printf("\n\nThe generic value is...");
switch(generic.type ){
case CHARACTER: printf("%c",generic.shared.c); break;
case INTEGER: printf("%d",generic.shared.i ); break;
case FLOAT: printf("%f",generic.shared.f );break;
default: printf("an unknown type:%c\n",generic.type );break;
}
}
typedef
通过typedef
关键字来定义结构或联合类型的别名,可以使代码更加简洁,
typedef struct{
int x;
int y;
}coord;
//通过typedef声明后,可以使用 coord 创建实例,
coord first;//因为是使用的typedef 因此不必在声明struct;