结构是一些值的集合,这些值称为成员变量。结构体每个成员都可以是不同类型变量
struct stu{
//member-list;--列表成员
char name[20];
short age;
char tele[12];
char sex[5];
};a1, a2, a3;//全局创建变量
//variable-list;--变量列表
struct-结构体关键字 stu-结构体标签 struct stu-结构体类型 {}--member-list:成员列表
typedef 是一种预处理器指令,用于创建现有数据类型的别名。这使得程序员可以在程序中使用更易于理解和记忆的名字来代替复杂的数据类型声明。
下面代码利用`typedef` 可以为结构体类型定义别名,使代码更清晰
typedef struct stu{
char name[20];
short age;
char tele[12];
char sex[5];
}stu;
int main() {
struct stu one; //局部创建
stu s2;
return 0;
}
提示:typedef 和 #define 都是 C 语言中的预处理器指令,但它们的作用和用途有所不同。typedef 用于创建新的数据类型别名,而 #define 用于创建符号常量。希望我的解释能帮助您更好地理解和使用这两种指令!
int main() {
struct stu s1 = { "小花",15,"123456789123","女" }; //局部创建
stu s2 = {"麻麻",20,"123456789123","男"};
return 0;
}
列表初始化是指通过使用大括号将结构体变量初始化为一个列表,其中列出所有成员变量和其对应值
指针->变量名
struct student {
char name[50];
int age;
};
// 使用.
struct student s = {"John", 23};
printf("%s\n", s.name);
printf("%d\n", s.age);
// 使用->
struct student *p = &s;
printf("%s\n", p->name);
printf("%d\n", p->age);
int main() {
struct stu s1 = { "小花",15,"123456789123","女" }; //局部创建
stu s2 = {"麻麻",20,"123456789123","男"};
printf("%s\n",s1.tele);
printf("%s\n",s2.tele);
printf("%s\n",s1.sex);
printf("%s\n",s2.sex);
return 0;
}
结构标签.变量名
typedef struct stu{
//成员变量:member-list;列表成员
char name[20];
short age;
char tele[12];
char sex[5];
double b;
}stu;//类型
//variable-list:变量列表
struct str
{
char name[20];
struct stu s1;
char* p;
};
int main() {
char arr[] = "hello byte";
struct stu s1 = { "小花",15,"cccc","女" }; //局部创建
struct str s3 = { "小明",{"小花",15,"123456789123","女" ,3.1415926},arr}; //局部创建
stu s2 = {"麻麻",20,"123456789123","男"};
printf("%s\n",s1.tele);
printf("%s\n",s2.tele);
printf("%s\n",s2.sex);
printf("%d\n",s3.s1.age);
printf("%lf\n",s3.s1.b);//浮点
printf("%s\n",s3.p);//指针--hello byte
return 0;
}
//利用函数
typedef struct stu {
char name[20];
short age;
char tele[12];
char sex[5];
double b;
}stu;
void prin(stu tmp) {
printf("name: %s\n",tmp.name );
printf("age: %d\n", tmp.age);
};
void prin2(stu* p) {//指针接收
printf("name: %s\n", p->name);
printf("age: %d\n", p->age);
};
int main() {
stu s1 = { "小花",15,"123456789123","女" };
//打印结构体数据
prin(s1);
prin2(&s1);//传地址
}
prin函数接收一个实参为stu类型的变量,在这个例子中,实参为s1。
prin2函数接收一个实参为stu类型的指针,在这个例子中,实参为&s1。
如果您只想通过函数打印一个结构体变量的信息,那么prin函数就足够了。
然而,如果您想通过函数对结构体进行更复杂的操作(比如修改结构体中的某个元素),那么您可能需要用到指向结构体的指针,这时就需要用到像prin2这样的函数了。
答案是:首选print2函数。
原因:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降
结论:
结构体传参的时候,要传结构体的地址
栈 :先进后出,后进先出
插入一个元素:压栈
删除一个元素:出栈
结构体是一种重要的数据结构,它可以将不同类型的数据组合在一起,形成一个单一的复合数据类型。以下是关于结构体的一些重要点:
malloc()
和calloc()
等函数来动态地分配结构体的内存。总之,结构体是C语言中一种非常有用的复合数据类型,可以帮助程序员更加高效地组织和管理数据。