C语言结构体

结构体:当需要将多个基本类型的值组合在一起才能表示一个有效的数据时,使用结构体。

例如:

定一个屏幕上一个点,需要横坐标x和纵坐标y两个值;

定义一个巨型需要横坐标x、纵坐标y、宽度width和高度height。


语法:

struct 结构体类型名{

//成员变量;

};

定义一个point结构体类型

struct point{

int x;

int y;

};

定义一个rect结构体类型

struct rect{

int x;

int y;

int width;

int height;

};


用结构体类型来定义变量:

1、先定义结构体类型,在定义结构体变量:struct 结构体类型 变量名;

2、同时定义结构体类型和结构体变量。

struct 结构体类型名{

//成员变量;

}结构体变量1,结构体变量2;


例子1:

void jiegoutitest1(){
	struct point{
		int x;
		int y;
	};

	struct point p1;
	struct point p2;

	struct rect{
		int x;
		int y;
		int width;
		int height;
	};
	struct rect r1;
	struct rect r2;

}

例子2:

void jiegoutitest1_2(){
	struct point{
		int x;
		int y;
	} p1; //定义结构体同时定义结构体变量p1

	//使用结构体类型定义p2
	struct point p2;

	struct rect{
		int x;
		int y;
		int width;
		int height;
	}r1;

	struct rect r2;

	//若程序以后不需再使用次结构体类型,可省略结构体类型名
	struct{
		int x;
		int y;
	}p3;
}

使用#define、typeof简写结构体:

#define写法:

#define POINT struct point 

#define RECT struct rect 

#define例子:

#include <stdio.h>
#define POINT struct point
#define RECT struct rect

void jiegoutitest2_1(){
	//预处理后会把POINT都替换为struct point
	POINT{
		int x;
		int y;
	}p1;

	POINT p2;

	struct rect{
		int x;
		int y;
		int width;
		int height;
	}r1;
	//预处理后会把RECT都替换为struct rect
	RECT r2;
}


typeof:可为已有数据类型起一个新名称。

typeof写法:typeof 已有类型 新名称; 

    typeof int Counter;

新名称定义变量:Counter i,j;

typeof struct point Point;

typeof enum season Season;

新名称定义变量:FKPoint p1;

FKSeason s1;

typeof例子:

void jiegoutitest2_2(){
	struct point{
		int x;
		int y;
	};
	typeof struct point FKPoint //为struct point类型定义新名字Point
	enum season {spring, summer,full,winter};
	typeof enum season Season;//为enum season类型定义新名字Season
	
	Point p1;
	Point p2;
	Season s1;
}
这段代码vs6上面编译报错,提示'typeof' : undeclared identifier  

很奇怪。


初始化结构体变量:

在定义结构体变量时执行初始化,一旦初始化完成或定义时没有执行初始化,以后都不能对结构体变量整体赋值。

只能分别对结构体成员进行赋值或访问:结构体变量.成员名

整体初始化:struct 结构体类型 结构体变量 = {成员值1,成员值2,成员值3...}

初始化值少于成员数量,只对前几个进行初始化

例子:

void jiegoutitest2_3(){
	struct point{
		int x;
		int y;
	}p1 = {10,20};//定义结构体变量p1同时初始化

	//p1 = {20,30};//再次对p1整体赋值是错误的
	
	struct point p2 = {15,20};
	printf("p1.x=%d, p1.y=%d\n", p1.x,p1.y);
	printf("p2.x=%d, p2.y=%d\n", p2.x,p2.y);
	struct point p3;//定义p3不初始化
	//p3={40,50}; //不能再对p3整体初始化
	p3.x = 40;//对结构体变量成员赋值是可以的
	p3.y=50;
	printf("p3.x=%d, p3.y=%d\n", p3.x,p3.y);

}
输出:




结构体数组:

定义数组时可对所有元素执行初始化,由于不允许在定义结构体变量后重新对结构体变量整体赋值,因此程序中也不允许对结构体数组元素整体赋值。

void jiegoutitest2_4(){
	struct point{
		int x;
		int y;
	};
	struct point pointArr[] = {
		{10,20},
		{15,20},
		{40,50}
	};

	//pointArr[0] = {1,2};//再对结构体数组元素整体赋值会出错
	pointArr[0].x =1;
	pointArr[0].y =2;
	for(int i=0; i< 3; i++){
		printf("pointArr[i].x=%d, pointArr[i].y=%d\n", pointArr[i].x, pointArr[i].y);
	}
}
输出:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值