结构体的声明
struct 结构名
{
类型 变量名;
类型 变量名;
...
}结构体变量;
结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。
如:
struct st1
{
int a;
char b;
} s1,s2;
//此声明了拥有2个成员的结构体,分别为整型的a,字符型的b
//定义了两个st1结构体类型变量s1,s2
还有另外两种方式
struct st2
{
int a;
char b;
};//声明
struct st2 a,b,c[10];//定义
//用st2标签的结构体,另外定义了变量a,b,c,c为结构体数组
也可以用typedef创建新类型
typedef struct st3
{
int a;
char b;
} st;
//现在可以用st作为类型声明新的结构体变量
st x,y,z[10];
//通过st定义了变量x,y,z,z为数组
//st换做struct st3,是一样的
结构体的初始化
struct st
{
int a;
char b;
char c[4];
}s={10,'A',"abc"};
结构体的访问
成员访问运算符(.):成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号
如下面代码的:st1.a,st1.b,st1.c
struct st
{
int a;
char b;
char c[4];
}st1;
int main()
{
st1.a=20;
st1.b='B';
strcpy(st1.c,"ABC");
printf("%d\n",st1.a);
printf("%c\n",st1.b);
printf("%s\n",st1.c);
}
结构体数组
在前面已经看到了结构体数组,下面我们来讲一讲结构体数组
struct student
{
char name[16]; //姓名
int num; //学号
int age; //年龄
int score; //成绩
}stu[4] =
{
{"zhang san", 5, 18, 99},
{"li si", 4, 17, 66},
{"wangwu", 1, 18, 48},
{"liu liu", 2, 17, 0}
};
结构体数组的访问
结构体数组的使用也很简单如,获取zhang san的成绩stu[1].score
例:输出以上信息
int
for(i=0;i<4;i++)
{
printf("%-16s%5d%5d%5d\n",stu[i].name,stu[i].num,stu[i].age,stu[i],score);
}
结构体指针
struct st
{
int a;
char b;
}st1={100,'A'};
struct st *p=&st1;//结构体指针
通过结构体访问结构体成员(*p).a
,或者是p->a
实例
#include <stdio.h>
struct
{
char *name; //姓名
int num; //学号
int age; //年龄
int score; //成绩
} stu1 = { "conan", 12, 18,100}, *pstu = &stu1;
int main()
{
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,成绩是%.1f\n", (*pstu).name, (*pstu).num, (*pstu).age,(*pstu).score);
printf("%s的学号是%d,年龄是%d,成绩是%.1f\n", pstu->name, pstu->num, pstu->age,pstu->score);
return 0;
}
结构体数组指针的使用
当一个指针的指向是一个结构体时,给这个指针变量+1,这个指针就会指向下一个结构体
#include<stdio.h>
struct student
{
char name[16]; //姓名
int num; //学号
int age; //年龄
int score; //成绩
}stu[4]=
{
{"zhang san", 5, 18, 99},
{"li si", 4, 17, 66},
{"wangwu", 1, 18, 48},
{"liu liu", 2, 17, 0}
};
struct student *p
int main()
{
for(p=stu;p<stu+4;p++)
{
printf("%-16s%5d%5d%5d\n",p->name,p->num,p->age,p->score);
}
return 0;
}