c语言----结构体
文章目录
常量符号化:const
定义:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
作用:
- 可以定义const常量,具有不可变性。
- 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
- 可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
- 以保护被修饰的东西,防止意外的修改
- 可以节省空间,避免不必要的内存分配
const int yellow=1;
const int red=2;
const int green=3;
枚举
定义:枚举是用户定义的一种数据类型,用关键字enum
用法:enum 枚举类型的名字 {名字0,名字1,名字2........};
如:enum colors{red,yellow,green};
枚举的类型名字不是真的需要,要用的是大括号里面的常量符号,他们的类型为int
型,值依次从0到n
enum colors{red,yellow,green};//申明一种枚举类型
/*意思: red=0
yellow=1
green=2
*/
enum colors c //定义一个变量c,它的类型为枚举类型colors
声明枚举量时可以指定值。指定值后面的值在在指定值的基础上加1
enum colors {red,yellow,green=5,blue}
/*意思: red=0
yellow=1
green=5
blue=6
*/
总结:枚举用的少(不好用)
结构体
声明结构体
第一种形式
//第一种形式
struct data{ //声明一个结构体类型:data
int month;
int day;
int year
};
struct data today; //定义data结构体类型的一个变量:today
today.month=2; //使用 today这种结构体变量
today.day=15;
today.year=2020;
第二种形式
//第二种形式
struct data{ //声明一个结构体类型:data
int month;
int day;
int year
}today; //定义data结构体类型的一个变量:today
第三种形式
//第三种形式
struct { //没有结构类型名
int month;
int day;
int year
}today; //定义data结构体类型的一个变量:today
- 如果结构体的声明放在函数里面,那只有这个函数能使用,其他函数不能使用
- 如果结构体的声明放在函数外面,多个函数可以使用这个结构体
结构体初始化
struct data{ //声明一个结构体类型:data
int month;
int day;
int year
};
//方式一
struct today={2,15,2020} //month=2;day=15;year=2020;
//方式二
struct today={.month=2,.day=15,.year=2020}//如果缺省,则为零
结构体成员
访问结构体成员的方式结构体变量+.+成员名
eg:today.month
结构运算
对于整个结构,可以赋值,取地址,也可以传递给函数参数
//第一种形式
struct data{ //声明一个结构体类型:data
int month;
int day;
int year
};
struct data today,pre_today; //定义data结构体类型的一个变量:today
today=(struct data){2,15,2020}; //赋值
pre_today=today;
结构指针
和数组不同,结构体变量并不是结构体变量的地址,必须使用&运算符
struct data *pdata=&today
定义了一个结构体变量,此结构体指向today的地址
struct data *pdata=&today; //定义一个结构体指针变量
printf("年:%d\n",pdata->year);
->
表示指针所指的结构体变量的成员
结构体和函数
结构体作为函数参数
int numberdays(struct data d)
整个结构可以作为参数值传入函数
这是是在函数内新建一个结构体变量,并复制调用的结构体值
也可以返还一个结构
结构体输入
方法一:建立临时结构体,并返还此结构体
struct data getstruct()
{
struct data d;
scanf("%d",&d.year);
scanf("%d",&d.month);
scanf("%d",&d.day);
return d;
}
//使用:
today=getstruct();
方式二:传入结构体变量
void getstruct1(struct data *d)
{
scanf("%d",&d->year);
scanf("%d",&d->month);
scanf("%d",&d->day);
}
//使用
getstruct1(&today);
结构中的结构
结构数组
#include"stdio.h"
struct data{ //声明一个结构体类型:data
int month;
int day;
int year;
};
struct data d[3]={ //定义结构体数组
{2,15,2020},
{2,16,2020},
{2,16,2020}
};
void main()
{
int i;
for(i=0;i<3;i++)//遍历结构体
{
printf("第%d此输出:%d年%d月%d日\n",i,d[i].year,d[i].month,d[i].day);
}
}
结果:
结构中嵌套结构
struct data_and_time{
struct data;
struct time;
};
struct data_and_time ds
struct data_and_time *d_s; //定义一个结构体指针变量
ds.data.year=2020;//引用某个成员
d_s=&ds;
d_s->data.year=2020;//引用某个成员
没有d_s->data->data=2020
因为data
不是一个指针
联合
自定义数据类型(typedef)
c语言提供一个叫typedef
的功能来声明一个已有的数据类型的新名字。比如:
typedef int length;
使得length
成为int
类型的别名
这样,length
这个名字就可以代替int
出现在变量定义和参数声明的地方了
typedef struct Data{
int month;
int day;
int year;
} data; //用data代替了Data这个结构体
data d; //等价于struct Data d;
明一个已有的数据类型的新名字。比如:
typedef int length;
使得length
成为int
类型的别名
这样,length
这个名字就可以代替int
出现在变量定义和参数声明的地方了
typedef struct Data{
int month;
int day;
int year;
} data; //用data代替了Data这个结构体
data d; //等价于struct Data d;
typedef *a[10] strings
strings是10个字符串的数组类型