C语言结构体的一些简单要点

简单结构与复杂结构

简单结构

结构是一个变量或多个变量的集合,集合有一个单独的名称,便于操作,结构可以和储存不同类型的变量,结构中的变量成为结构的成员。

声明和定义结构

如果要编写一个图形程序,就要处理屏幕上的坐标,可以声明一个坐标变量,包含
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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值