结构体的声明
可以放在任何位置声明,但一般都放在main函数外面声明,这样声明后的结构体可以在整个程序中使用而不依附于任何函数;
//第一种声明形式
struct point {
int x;
int y;
};
//声明了一种结构point;
//第二种声明形式
struct {
int x;
int y;
}p1,p2;
//定义了p1,p2变量;
//这种声明形式没有结构标识符,不能在程序的其他位置定义变量,不经常使用;
//第三种声明形式
struct point {
int x;
int y;
}p1,p2;
//声明point结构并定义了p1,p2两个结构变量;
结构的初始化
#include<stdio.h>
struct date {
int month;
int day;
int year;
};
int main(){
struct date today={
07,14,2022
};
struct date thismonth={
.month=7, .year=2022
};
//该形式的初始化只给部分变量赋值,类似数组,没被赋值的变量值为0;
printf("%i %i %i\n",today.day,today.month,today.year );
printf("%i %i %i",thismonth.day,thismonth.month,thismonth.year );
return 0;
}
访问结构成员
使用.运算符访问结构成员
结构和指针
结构指针变量名->成员名(通过箭头arrow更简单的表达(*p).成员名)
结构和函数
#include<stdio.h>
struct point {
int x;
int y;
}p;
struct point* getstruct(struct point *p){
scanf("%d",&p->x);
scanf("%d",&p->y);
printf("%d %d",p->x,p->y);
return p;
}
//结构指针做形参改变结构成员的值
void output(struct point p){
printf("%d,%d",p.x,p.y);
}
//结构变量做形参输出结构成员的值
void print(const struct point *p){
printf("%d %d",p->x,p->y );
}
//结构指针做形参输出结构成员的值
int main(){
struct point p={0,0};
getstruct(&p);
output(p);
output(*getstruct(&p));
print(getstruct(&p));
//结构函数的嵌套调用
return 0;
}
结构中的结构
struct date{
int month;
int day;
};
struct time{
int hour;
int second;
};
struct dateAndTime{
struct date sdate;
struct time stime;
};
//结构中的结构;
struct dateAndTime t;
struct dateAndTime *p=&t;
//以下几种形式等价
t.sdate.month;
p->sdate.month;
typedef自定义数据类型
关键字typedef用于为系统固有的或用户自定义的数据类型定义一个别名。
typedef int length;
//表示length这个名字以后可以代替int出现在变量定义和参数声明的地方;
typedef struct date{
int month;
int day;
}Date;
//今后需要struct date出现的地方都可以用Date代替;
typedef struct{
int month;
int day;
}Date;
//与上面等价,表示结构标识符是什么已经不重要了,因为有更好的表达即Date来表达结构类型;
联合
多个变量共享同一内存,每一时刻只有一个成员起作用,有效成员在执行期间确定;
关键字union
union unnode{
int n;
double a;
char c;
};
//联合的声明;
union unnode u,u1;
//联合变量的声明;
声明联合变量时编译器为联合变量分配内存单元时,按照联合成员中最长的那一个类型为联合变量分配存储空间;
一次只能对第一个成员进行初始化,此外,联合也不能进行比较操作,不能作为函数参数;
常用的使用union的场合
#include<stdio.h>
#include<string.h>
typedef union date{
int x;
char s[sizeof(int)];
}Date;
int main(){
int i;
Date day=1234;//对联合变量进行初始化只可对第一个成员赋值;
for(i=0;i<sizeof(int);i++){
printf("%02hhX",day.s[i]);
}
printf("\n");
return 0;
}
//使用union得到一个整数内部的字节