深圳网站建设哪个公司好,网站建设模板源码特效,网站建设报价单表格模板,长沙广告网页设计人才招聘#x1f3ac; 鸽芷咕#xff1a;个人主页 #x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想#xff0c;就是为了理想的生活! 文章目录 #x1f4cb; 前言1 . 什么是结构体1.1 结构的定义1.2 结构的声明 2.结构体初始化2.1 用标签名定义和初始化2.2… 鸽芷咕个人主页 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想就是为了理想的生活! 文章目录 前言1 . 什么是结构体1.1 结构的定义1.2 结构的声明 2.结构体初始化2.1 用标签名定义和初始化2.2 typedef 的结构体定义2.3 typedef 的结构体初始化 3. 结构体成员的访问2.1 通过点操作符.访问2.1.1 点操作符.单独给结构体成员赋值2.1.2 给数组结构体成员赋值的注意事项2.1.3 正确的给数组结构体成员赋值 2.2 指针访问 - 箭头的方式访问 4. 结构体该如何传参4.1 错误的结构体传参4.2 正确的结构体传参 全篇总结 前言 hello 各位宝子们大家好啊前面我们学完指针了就正式进入到结构体这一章节了。 ⛳️结构体使我们自定义类型的一种应用可以说非常广泛了。今天就给大家大家详细解析一下结构的内容详解以及各种注意事项 本期文章收录在 《C语言初阶》大家有兴趣可以看看呐 ⛺️ 欢迎铁汁们 ✔️ 点赞 收藏 ⭐留言 1 . 什么是结构体 ⛳️ 关于结构体我们可以这样理解数组是一些相同元素的集合那么结构体就是不同类型值的的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。 所以说结构体是一些值的集合这些值称为成员变量每个成员可以是不同类型的变量 1.1 结构的定义 那么结构体该如何定义呢结构体其实就和 int 整形是一模一样的结构体也是一个类型。想定义一个结构体变量首先需要先声明这个结构的类型成员是那些 结构体的声明关键字struct下面我们就来看一下结构体是如何声明的吧 1.2 结构的声明 结构体的语法形式
struct tag
{member - list;
}variable - list; 结构体的关键字是 struct 后面跟的 tag 是 结构体的标签名可以自定义。我们也根据实际情况自定义 member - list 大括号里面需要的就是我们成员列表了为什么叫成员列表因为结构体里面可以一个或多个不同类型的成员variable - list 这个是变量列表的意思 可能各位铁汁还是不明白。我们来看一下实际例子大家就明白了例如描述一个学生
学生那就需要 姓名 年龄 性别 和 学号而结构体刚好可以满足不同类型的变量 代码演示
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}; //分号不能丢总结
结构体定义需要结构体关键字结构体标签名。成员变量的类型和名字和结构体后面的分号。
2.结构体初始化
2.1 用标签名定义和初始化 结构体类型的声明和定义都回了。那么一个结构体类型我们该怎么创建一个结构体的变量呢答案是使用结构体的标签名用来定义结构体变量或者在创建结构体的时候直接在后面跟上结构体变量 在声明结构体是创建的结构体变量是 全局变量在大括号里面创建的结构体是 局部变量 代码演示
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1
//全局变量
int main()
{struct Point p2;//直接使用标签名定义//局部变量return 0;
}而初始化的话也非常简单和数组是差不多的每个成员赋值用大括号扩起来单引号隔开就好了
大括号括起来后面加引号每个成员逗号隔开 代码演示
struct Point
{int x;int y;
}p1 { 2, 1 };//创建时直接赋值
int main()
{struct Point p2 {12,13};//直接使用标签名定义//然后进行赋值 return 0;
}
2.2 typedef 的结构体定义 这时候大家就会发现诶呀结构体的变量的定义也太麻烦了吧还要写结构体的关键字和标签名一点也不简便那么有没有简便的方法呢这时候就需要用到 typedef 重命名关键字来重新定义结构体名称了 使用 typedef 重命名结构体后结构体大括号后面跟的第一个变量就是结构体重命名后的类型名。而我们想要在定义的话只需要写出重命名之火后的类型名就好了非常便捷。 代码演示
#include stdio.h
typedef struct Point
{int x;int y;
}Pt;//重定义后的类型名
int main()
{Pt p2 { 12,13 };//typedef重定义类型名定义//结构体变量然后进行赋值 return 0;
}代码结果 2.3 typedef 的结构体初始化 typedef 的结构体初始化和标签名初始化一模一样但是不能和标签名一样在结构体类型的最后一行直接创建结构体变量和初始化了。 typedef 重命名了在声明后面就不能再创建我们的结构体变量了。因为typedef 的定义结构体后面默认跟的是重命名的类型名。 代码演示
#include stdio.h
typedef struct Stu
{char name[20];//姓名int age;//年龄char sex[5];//性别char id[20];//学号}Stu;
//全局变量
Stu p1 { .id 20202356,.age 18, .name lisi,.sex nan };
int main()
{printf(姓名\t年龄\t性别\t学号\n);//局部变量Stu p2 { .id 202329,.age 20, .name zhangsan,.sex nan };printf(%-10s\t %d\t %s\t %s\n, p1.name, p1.age, p1.sex, p1.id);printf(%-10s\t %d\t %s\t %s\t, p2.name, p2.age, p2.sex, p2.id);return 0;
} 代码结果
3. 结构体成员的访问
2.1 通过点操作符.访问 通过点操作符.访问其实非常简单 我们要访问结构体时先 写出结构体变量在 (.)找到我们要访问的成员就好了。 代码演示
#include stdio.h
struct Point
{int x;int y;
};int main()
{struct Point s { 20, 2 };//初始化printf(%d\t%d,s.x,s.y);return 0;
}代码结果 2.1.1 点操作符.单独给结构体成员赋值 诶我们点的操作符是不是不难通过点操作符我们可以访问到结构体成员那么是不是可以给结构体成员单独赋值呢答案是可以的 因为通过点操作符我们就可以单独找到我们的结构体变量了 下面我们来示范一下 代码演示
#include stdio.h
typedef struct Point
{int x;int y;
}Pt;int main()
{Pt s { 0 };s.y 10;s.x 20;printf(%d %d, s.x, s.y);return 0;
}代码结果 2.1.2 给数组结构体成员赋值的注意事项 但是我们注意在给数组赋值的时候是否可以这样写假设结构体成员 char name[20] 是个数组s.name “李四”;这样赋值正确吗答案是不正确; name 是什么是地址啊? 我们通过点操作符找到的是地址。赋值需要的是什么肯定是空间啊我们要给存放结构体成员的空间赋值。 注左值是指空间的意思
2.1.3 正确的给数组结构体成员赋值 所以我们在给结构体数组赋值的时候如果是字符数组就需要用 strcpy 库函数赋值如果是整形数组就只能用循环遍历然后利用下标找到空间一个个赋值。 字符数组:需要用 strcpy 拷贝字符串库函数赋值整形数组;能用 循环遍历 然后利用下标找到空间一个个赋值 代码演示
#include stdio.h
#include string.h
typedef struct Stu
{int arr[10];int age;char name[20];
}S;int main()
{S s { 0 };s.age 26;int i 0;for (i 0; i 10; i){s.arr[i] i;printf(%d , s.arr[i]);}printf(\n);strcpy(s.name, 张三);printf(%d %s, s.age, s.name);return 0;
}代码结果
2.2 指针访问 - 箭头的方式访问 如何我们拿到的是一个结构体指针那么该如何访问呢那么这时就可以使用 - 箭头操作符来进行访问了。 先写出指针变量然后使用 - 箭头操作符指向结构体成员诶这是不是非常合理用指针指向结构体成员 现在的编译器已经十分智能了一旦我们使用的是结构体指针他就会给我们转换为 箭头访问的方式
如果我们使用点操作符( . ) ,就需要先对指针解引用找到指针所指向的空间然后再进行 使用点操作符( . ) 找到成员 (*x).y 20 。 所以我们在使用结构体指针的时候一定要要使用箭头访问这样程序才更加高效 代码演示
#include stdio.h
typedef struct Point
{int x;int y;
}Pt;
void test(Pt* x)
{x-x 10;x-y 20
}
int main()
{Pt ps { 0 };test(ps);printf(%d %d, ps.x, ps.y);return 0;
}4. 结构体该如何传参
struct S
{int data[1000];int num;
};
struct S s {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{printf(%d\n, s.num);
}
//结构体地址传参
void print2(struct S* ps)
{printf(%d\n, ps-num);
}
int main()
{print1(s); //传结构体print2(s); //传地址return 0;
}上面的 print1 和 print2 函数哪个好些答案是首选print2函数。因为 函数传参的时候参数是需要压栈会有时间和空间上的系统开销。 如果传递一个结构体对象的时候结构体过大参数压栈的的系统开销比较大所以会导致性能的下降。 所以结构体传参的时候一定要传地址 由于函数在传递参数时如果我们传的是实参那么形参将是实参的一份临时拷贝。如果我们传过去的结构体很大那么形参也要开辟相同大小的空间就会照成空间的浪费
4.1 错误的结构体传参 我们来看一下下面这个例子大家就明白了这里我们在 main() 主函数里面创建了结构体变量想通过 test() 函数进行赋值。 但是我们是 传值调用 所以改变形参并不会改变实参。形参只是实参的一份临时拷贝 #include stdio.h
typedef struct Point
{int x;int y;
}Pt;void test(Pt pf)
{pf.x 2;pf.y 3;
}
int main()
{Pt p2 {0};test(p2);printf(%d %d, p2.x, p2.y);return 0;
}代码结果 4.2 正确的结构体传参 所以我们在结构体传参的时候一定要使用 传址调用 这样才能改变我们的结构体 如果只想使用里面的值而不想改变结构体变量 只许需要加上const修饰一下指针让指针所指向的值不能发生改变这样就可以了 代码演示
#include stdio.h
typedef struct Point
{int x;int y;
}Pt;
void test(Pt* x)
{x-x 10;x-y 5;
}
void test1(const Pt* x)
{printf(%d %d, ps.x, ps.y);
}
int main()
{Pt ps { 0 };test(ps);test1(ps);printf(%d %d, ps.x, ps.y);return 0;
}代码结果 全篇总结
✅ 归纳 好了以上就是关于结构体的万字解析和使用的全部注意事项就全部讲解完毕啦 结构体的声明与定义 结构体变量的创建与初始值 点操作符.使用的注意事项 箭头操作符的讲解 结构体传参的注意事项 ☁️ 把本章的内容全部掌握铁汁们就可以彻底拿捏结构体了 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注 ❤️ 拜托拜托这个真的很重要 你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。