结构体:当需要将多个基本类型的值组合在一起才能表示一个有效的数据时,使用结构体。
例如:
定一个屏幕上一个点,需要横坐标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);
}
}
输出: