C语言结构

结构类型

1.定义

  • 结构是逻辑上相互联系的一组分量的集合
  • 结构中的分量可以是不同类型的数据,称为结构的成员
  • 在使用结构之前,首先根据具体问题,利用已有的数据类型对结构的组成进行描述,成为结构的定义
    2.一般形式:
    struct 结构类型名
    {
    成员列表;
    };
    举个例子:
struct student//struct student为结构类型名,student为标签
{
	int num;
	char name[20];
	char sex;
	struct date1  age;//age为date1结构
	char addr[30];//花括号中间的为成员
};//分号表示结束
struct date1
{
int year;
int month;
int day;
};

结构变量

1.定义

  • 在定义结构类型之后,表示声明了一种新的数据类型,并没有内存空间的分配。
  • 必须用结构类型定义相应的变量才能使用
    方法一:先声明结构类型再定义变量
    struct 结构类型名
    {
    成员表列;
    };
    struct 结构类型名 变量名表列;
    方法二:在声明结构类型的同时定义变量
    struct 结构类型名
    {
    成员表列;
    }变量名表列;
    方法三:省去结构标签直接定义变量
    struct
    {
    成员表列;
    }变量名表列;
    可用符号常量代表一个结构类型名
    例子:
#define STUDENT struct student
STUDENT
{
int num;
char name[20];
char sex;
int age;
char addr[30];
};
/*此时,可直接用STUDENT定义变量,如:
	STUDENT s1,s2;
	不必再写
	struct student s1,s2;*/

可用typedef定义一个新的数据类型名

typedef struct student STUDENT;
//或
typedef struct student
{
int num;
char name[20];
char sex;
int age;
char addr[30];
}STUDENT;
//此时可以直接用STUDENT定义变量,
//STUDENT s1,s2;

2.存储:
结构变量的存储分配与计算机系统及所定义的结构有关。为了提高CPU的存储速度,多数编译系统对结构中成员变量的存储分配采用按字节“对齐”的方法。分配原则如下:

  • 各成员按照定义顺序依次存放,但并不是紧密排列,成员的存储位置存储在自己宽度的整数倍上开始。
  • 检查所有成员的存储长度之和是否为成员中最宽的,元素长度的整数倍,若不是,则补齐为整数倍。

3.初始化与引用
初始化:结构类型 结构变量名={初始值表};
引用:结构变量是用 . 运算符和成员名字访问其成员

4.使用规则

  • 对于整个结构,可以做赋值,取地址,也可以传递给函数参数,如
struct point
{
int x;
int y;
}p1,p2;
p1=(struct point){5,10};//相当于p1.x5;p1.y=10;
p2=p1;//相当于p2.x=p1.x;p2.y=p1.y;
  • 不能将一个结构变量作为一个整体进行输入和输出;只能对其各个成员分别进行操作
  • 若成员本身又属于一个结构体类型,只能对最低级的成员进行存取及运算
  • 队成员变量可以向普通变量一样进行各种运算
  • 可以引用成员的地址,也可以引用结构体变量的地址
  • 与数组不同,结构变量的名字不是其地址,如果想获得其地址,需要使用&运算符。

结构数组

1.定义
struct 结构类型名
{
成员列表;
};
struct 结构类型名 结构数组名[尺寸];

2.初始化和引用
结构数组的初始化一般形式是在定义数组的后面加上={初值表列},也可在声明结构类型的同事定义数组并完成初始化
引用时使用下标进行访问,要访问某个具体元素的成员,又要使用 . 和成员名

结构指针

1.指向结构变量的指针
struct 结构类型名 *结构指针变量名;
结构变量的名字并不是结构变量的地址,必须使用&运算符

struct student
{
int number;
char name[15];
float score[3];
}x,*p;
p=&x//p=x错误

引用结构变量x的成员有三种方法:

  • x.成员名
  • (*p).成员名
  • p->成员名

2.指向结构数组的指针


struct student
{
int num;
char name[15];
float score[3];
};
struct student stu[5],*p;
p=stu;//或者p=&stu[0];

引用:

  • p->score[0];
  • stu[0].score[0];
  • p+1指向下一个结构数组元素stu[1],p+2指向的是stu[2]的首地址

结构类型数据在函数间的传递

1.结构变量作为函数参数

  • 整个结构作为函数的参数
    将结构作为整体,在函数之间传递整个结构;在被函数内新建一个结构变量,并接受调用者的值
  • 结构成员作为函数的参数
    在函数之间传递成员的值,与传递简单变量相同
  • 函数也可以返回一个结构

2.结构指针变量作为函数参数

  • 向函数传递的是结构的首地址
  • 形参可以是结构数组,传递的是结构指针的值
  • 传入传出只是一个指针的大小,而不是整个结构
  • 函数返回一个结构指针
    3.结构数组作为函数参数
  • 向函数传递的是结构数组的首地址
  • 形参可以是结构数组,也可以是结构指针
  • 仅复制结构的首地址,这种按地址传递方式效率更高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值