声明一个结构体类型的一般形式如下:
struct 结构体类型名
{
成员表列
};
结构体的类型可以有很多种,结构体类型中的成员由开发者自己定义,并且成员不用初始化。
另外,一个结构体成员可以属于另一个结构体类型,例如:
struct TIME
{
int date;
int month;
int year;
int hour;
int min;
int sec;
};
struct nmea_msg
{
struct TIME utc;
char gpssta;
int longitude;
int latitude;
short speed;
short altitude;
};
定义结构体变量的方法有三种:
1.先声明结构体类型,再定义该类型变量:
一般形式为:
struct 结构体类型名
{
成员表列
};
struct 结构体类型名 变量名表列;
例如:
struct UDP_Server_Thread_Para
{
void *pData;
int Len;
};
struct UDP_Server_Thread_Para UDPThreadPara1,UDPThreadPara2;
一个在该定义方式下的程序例子:
#include<stdio.h>
struct UDP_Server_Thread_Para
{
void *pData;
int len;
};
int main()
{
struct UDP_Server_Thread_Para UDPThreadPara1,UDPThreadPara2;
UDPThreadPara1.pData = "hello";
UDPThreadPara1.len = 1;
UDPThreadPara2.pData = "world";
UDPThreadPara2.len = 2;
printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);
printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);
return 0;
}
2.在声明的同时定义变量:
一般形式为:
struct 结构体类型名
{
成员表列
}变量名表列;
例如:
struct UDP_Server_Thread_Para
{
void *pData;
int Len;
}UDPThreadPara1,UDPThreadPara2;
一个在该定义方式下的程序例子:
#include<stdio.h>
struct UDP_Server_Thread_Para
{
void *pData;
int len;
}UDPThreadPara1,UDPThreadPara2;
int main()
{
UDPThreadPara1.pData = "hello";
UDPThreadPara1.len = 1;
UDPThreadPara2.pData = "world";
UDPThreadPara2.len = 2;
struct UDP_Server_Thread_Para UDPThreadPara3; //新增该结构体类型变量
UDPThreadPara3.pData = "!!!!";
UDPThreadPara3.len = 3;
printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);
printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);
printf("UDPThreadPara3: %s, len %d\n", (char*)UDPThreadPara3.pData, UDPThreadPara3.len);
return 0;
}
3.不指定类型名直接定义结构体类型变量:
一般形式为:
struct
{
成员表列
}变量名表列;
struct
{
void *pData;
int Len;
}UDPThreadPara1,UDPThreadPara2;
这种方式只能够定义一次,不能再以此定义其它变量。
一个在该定义方式下的程序例子:
#include<stdio.h>
struct
{
void *pData;
int len;
}UDPThreadPara1,UDPThreadPara2;
int main()
{
UDPThreadPara1.pData = "hello";
UDPThreadPara1.len = 1;
UDPThreadPara2.pData = "world";
UDPThreadPara2.len = 2;
printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);
printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);
return 0;
}
获取结构体成员
通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName
或者:
pointer->memberName
第一种写法中,.
的优先级高于*
,(*pointer)
两边的括号不能少。如果去掉括号写作*pointer.memberName
,那么就等效于*(pointer.memberName)
,这样意义就完全不对了。
第二种写法中,->
是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->
在C语言中的唯一用途。
上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。
【示例】结构体指针的使用。
#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
return 0;
}
运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
【示例】结构体数组指针的使用。
#include <stdio.h>
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[] = {
{"Zhou ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"Liu fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
}, *ps;
int main(){
//求数组长度
int len = sizeof(stus) / sizeof(struct stu);
printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
for(ps=stus; ps<stus+len; ps++){
printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
}
return 0;
}
运行结果:
Name Num Age Group Score Zhou ping 5 18 C 145.0 Zhang ping 4 19 A 130.5 Liu fang 1 18 A 148.5 Cheng ling 2 17 F 139.0 Wang ming 3 17 B 144.5