虚拟机中建设iis网站,河南做网站推广,网站开发招标书,wordpress子站大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解C语言的结构体#xff08;初阶#xff09;#xff0c;以后会出进阶的#xff0c;如果大家觉得我写的不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 目录 ① WHO IS 结构体② 结构体的作… 大家好我是苏貝本篇博客带大家了解C语言的结构体初阶以后会出进阶的如果大家觉得我写的不错的话可以给我一个赞吗感谢❤️ 目录 ① WHO IS 结构体② 结构体的作用③ 结构体细节1. 结构体的声明2. 结构成员的类型3. 结构体变量的定义和初始化4. 结构体成员的访问5. 结构体作为函数参数 ① WHO IS 结构体
结构是一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量这与数组不同数组是一组相同类型元素的集合 ② 结构体的作用
1.首先我们之前所学的int,char,double等类型都是内置类型单个的它们无法描述一个复杂对象比如描述一个人那就可能要描述他的名字、性别、年龄等这些显然是不能通过某个内置类型来很好的描述的所以结构体应运而生
2.在实际项目中结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单研发人员通常使用结构体创造新的“属性”其目的是简化运算。
3.结构体在函数中的作用不是简便最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么只要根据定义使用就可以了。 ③ 结构体细节
1. 结构体的声明
首先要使用结构体就必须先声明一个结构体类型。其中struct是关键字不能省略若一定要省略也行用typedef下面会讲到struct后接结构体名struct结构体名表示一个结构体类型这与内置类型如int,double,long等一样可以用来定义变量 member-list是成员变量的列表包含不同的基本类型variable-list是变量列表可写可不写写了该变量就是全局变量。
struct 结构体名
{member-list;//成员变量的列表
}variable-list;//变量列表例如描述一个学生
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};//分号不能丢注意 1.结构体类型{ }后面的 (分号)不能省略 2.struct后面也可没有结构体名如下
struct
{int a;char b;
}s1;这种形式是被C语言允许的但是我们一般不去使用因为这种结构体类型的声明只能定义一次变量以后不能再定义这就不方便该结构体以后的使用因此不推荐写这种形式的结构体类型 上面有讲到struct是关键字不能省略但如果用typedef就可以省略这是怎么回事呢让我们往下看 typedef即类型重定义意思是给数据类型起一个新的名字。 所以下面的stu并非定义的变量而是struct Stu的重命名所以以后既可用struct Stu定义变量也可用stu定义变量
typedef struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}stu;2. 结构成员的类型
结构的成员可以是标量、数组、指针甚至是其他结构体。
struct B
{char ch[5];int age;
};
struct A
{char c;int arr[10];double* pd;struct B b;struct B* pb;
};3. 结构体变量的定义和初始化
(1) 定义可以在以下地方定义结构体变量应该尽量少的使用全局变量
1.结构体类型{ }的后面;(分号)的前面全局变量 2.结构体类型的后面main函数上面全局变量 3.main函数里面局部变量
struct B
{char ch[5];int age;
};
struct A
{char c;int arr[10];double* pd;
}a, b;//a,b是全局变量struct A d;//d是全局变量int main()
{struct A f;//f是局部变量return 0;
}2初始化
1.按照顺序初始化 2.指定成员来初始化 3.单个初始化
struct A
{char m;int arr[10];double* pd;
}s1 { .m c,.arr {1,2,3} }; //指定成员来初始化;int main()
{double d 3.14;//1.按照顺序初始化struct A s3 { q,{ 1,2,3,4,5 } ,d };//2.指定成员来初始化struct A s4 { .m r,.pd d };//3.单个初始化struct A s5;s5.m w;return 0;
}4. 结构体成员的访问
1.结构体变量访问成员 结构变量的成员是通过点操作符.访问的。点操作符接受两个操作数 例如
struct stu
{char name[20];int age;
};
int main()
{struct stu s1 { zhangsan,18 };//s1初始化printf(%s %d\n, s1.name, s1.age);//s1的成员访问return 0;
}2.结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量而是指向一个结构体的指针。那该如何访问成员 答案使用 -
struct Stu
{char name[20];int age;
};
void print(struct Stu* ps)
{//以下两种方式都可以printf(name %s age %d\n, (*ps).name, (*ps).age);//*pss//使用结构体指针访问指向对象的成员printf(name %s age %d\n, ps-name, ps-age);
}
int main()
{struct Stu s { zhangsan, 18 };//写一个函数打印s中的数据print(s);//结构体地址传参return 0;
}5. 结构体作为函数参数
直接上代码
struct Stu
{char name[20];int age;
};void set(struct Stu* bs)
{bs-age 18;//bs-name zhangsan;//err//因为name是数组名在此情况下数组名是首元素地址为常量//因此如果想将name改变可以strcpy(bs-name, zhangsan);
}void print1(struct Stu ps)
{printf(%s %d\n, ps.name, ps.age);
}void print2(struct Stu* ps)
{printf(%s %d\n, ps-name, ps-age);
}int main()
{struct Stu s { 0 };//写一个函数打印s中的数据set(s);//写一个函数打印s中的数据print1(s);print2(s);return 0;
}由上述代码可知函数传参既可传值也可传址。在结构体作为函数参数时参数可以是结构体变量也可以是结构体变量的地址。那两者谁更好呢 答案是传结构体变量的地址。因为函数传参的时候参数是需要压栈的。如果传递一个结构体对象的时候结构体过大参数压栈的的系统开销比较大所以会导致性能的下降 。简单来讲就是因为形参是实参的一份临时拷贝若实参即结构体过大那么形参也会较大这样就会导致效率降低。但传结构体变量的地址的话形参的大小只是4个或8个字节效率较传结构体更高 结论 结构体传参的时候要传结构体的地址。 好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️