一、放置位置
定义结构类型可以放在函数外也可以放在函数内
放在函数内只有本函数可以使用其他函数无法使用
一般情况下将其放置在函数体外
放在函数体外正整个程序都可以调用
二、声明结构类型的三种方式
1、
struct date{
int month;
int day;
int year;
};
struct date today1,today2;
表示today1,today2都是date结构类型,里面都有 int month; int day; int year;三个变量
2、
struct {
int month;
int day;
int year;
} today1,today;
表示today1,today2都是无名结构类型,里面都有 int month; int day; int year;三个变量
3、
struct date{
int month;
int day;
int year;
} today1,today2;
表示today1,today2都是date结构类型,里面都有 int month; int day; int year;三个变量
#include <stdio.h>
struct date{
int month;
int day;
int year;
};//定义一个date结构类型,date类型里面包含三个int类型的数据
int main(){
struct date today;//定义一个date结构类型的变量today
today.month=03;
today.day=28;
today.year=2024;
printf("今天是%i-%i-%i.\n",
today.year,today.month,today.day);
return 0;
}
三、结构类型初始化
方法一:按照定义的变量顺序给变量today里面的三个元素赋初值
方法二、指定赋值可以不按顺序,未赋值的元素自动为0
#include <stdio.h>
struct date{
int month;
int day;
int year;
};
int main(){
struct date today1={03,28,2024};
//方法一:按照定义的变量顺序给变量today里面的三个元素赋初值
struct date today2={.month=03,.year=2024};
//方法二、指定赋值可以不按顺序,未赋值的元素自动为0
printf("今天是%i-%i-%i.\n",
today1.year,today1.month,today1.day);
printf("今天是%i-%i-%i.\n",
today2.year,today2.month,today2.day);
return 0;
}
四、结构和数组的区别
1、访问
数组
int word[a,b,c,d,e,]
采用数组名+下标访问成员word[0]=a
结构
struct word[int a,int b,int c,]
采用运算符"."+结构变量名称访问元成员
word.a=a
2、指针
数组
char *p=word;指向数组的指针可以不用取地址符
结构
指向结构的指针必须使用取地址符
struct date *p=&word;
五、数据结构运算
结构不止可以取地址、传递给函数参数,还可以整体参与运算,整体相互赋值
date today1={03,28,2024};
date today2={04,29,2025};
date today1=date today2是将today2整体赋值给today1
此时 date today1={04,29,2025};
强制转换赋值
today3= (struct date){05,30,2025}
将{}里面的值强制转换为 struct date类型赋值给today3
#include <stdio.h>
struct date{
int month;
int day;
int year;
};
int main(){
struct date today;
today=(struct date){03,28,2024};//强制转换赋值
struct date day;
struct date *p=&today;
day=today;//整体赋值
day.year=2025;//单一成员修改
printf("今天是%i-%i-%i.\n",
today.year,today.month,today.day);
printf("今天是%i-%i-%i.\n",
day.year,day.month,day.day);
printf("指向today的指针p=%p\n",p);
return 0;
}