认识结构体
结构体的类型与变量
在C语言中,结构体类型名称和结构体变量名称是不同的,它们有不同的作用和用法。结构体类型名称是用来定义结构体的类型的,它由关键字struct和结构体的标识符组成,例如
struct Student {
char name[20];
int age;
float score;
};
而结构体变量名称则是用来声明和定义实际的结构体变量的,它由结构体类型名称和具体的变量名组成,例如:
在上面的例子中,"struct Student"就是结构体的类型名称,它定义了一个名为Student的结构体类型,包含了name、age和score三个成员变量。
而结构体变量名称则是用来声明和定义实际的结构体变量的,它由结构体类型名称和具体的变量名组成,例如:
struct Student stu1;
因此,结构体类型名称用于定义结构体类型,而结构体变量名称用于声明和定义实际的结构体变量。需要注意的是,结构体类型名称和结构体变量名称可以不同。
结构体变量的定义
struct date {
int day;
int month;
int year;
};d1={11,2,2019},d2;
相当于在struct date类型定义了d1和d2两个变量。d1进行了初始化。通俗来讲,我们可以把struct date看成是int,float等类型,而d1和d2就是我们经常设的i。
用typedef重命名
typedef struct date {
int day;
int month;
int year;
} Date;
Date d1 = {11, 2, 2019};
与用struct定义没什么太大区别,不同点就是给结构体加了个别名Date,在后期修改中,我们可以直接改变别名而不用全文修改,在这两个代码看不出来,但我们学到单片机时就会非常实用,大多用第二种方式定义。还有一个不同点就是可以不用关键字struct。
例如下面代码
struct Person {
int age;
char name[20];
};
int main() {
struct Person p1; // 使用关键词struct
p1.age = 25;
strcpy(p1.name, "John");
// 其他操作
return 0;
}
typedef struct {
int age;
char name[20];
} Person;
int main() {
Person p1; // 不需要使用关键词struct
p1.age = 25;
strcpy(p1.name, "John");
// 其他操作
return 0;
}
注意:像Date d1 = {11, 2, 2019};,我们也可以放到主函数里。
结构体变量成员的引用
基本认识
首先看下列代码
#include <stdio.h>
typedef struct date {
int day;
int month;
int year;
} Date;
int main() {
Date d;//定义
d.month = 12; // 引用结构体变量中的 month 成员
printf("Month: %d\n", d.month);
return 0;
}
d.month 指的是类型是struct Date的Date d中的变量month,若定义为Date s;,则变成s.month(不管d还是s,l里面还有很多的成员,要用 .引出来),所以不管是d还是s都是数据类型为Date的变量。
提醒一点,不可以写成下面的样子。在C语言中,结构体成员不能在结构体内部直接初始化。
typedef struct date {
int day;
int month;
int year=3;
} Date;
此外, 想要打印整个变量名不能使用printf(" %d\n", Date d1);,而是写成printf(“Date: %d/%d/%d\n”, d1.day, d1.month, d1.year);。输出输入,赋值等操作都必须访问各个成员。对于相同类型的成员可以整体赋值。
指针访问
当使用指针访问结构体成员时,可以使用"->"运算符。下面是一个简单的C语言代码示例,展示了如何使用指针访问结构体成员:
#include <stdio.h>
// 定义一个结构体
struct Date {
int day;
int month;
int year;
};
int main() {
// 声明一个结构体变量
struct Date d1 = {12, 4, 2022};
// 声明一个指向结构体的指针,并将其指向d1
struct Date *ptr = &d1;
// 使用指针访问结构体成员并打印其值
printf("Day: %d\n", ptr->day);
printf("Month: %d\n", ptr->month);
printf("Year: %d\n", ptr->year);
return 0;
}
在这个示例中,我们声明了一个Date类型的结构体变量d1,并初始化了它的成员。然后,我们声明了一个指向Date结构体的指针ptr,并将其指向d1。最后,我们使用ptr->day、ptr->month和ptr->year来访问结构体成员,并打印它们的值。
结果如下