C 语言高级数据结构
主要涵盖 C 高级数据结构,在用 python 的时候,这门语言的灵活性令人咂舌,如:
# python lis = ["string", 1, 3.98, False, {"name":"beginman", "age":24}, None]
在 python 列表里面可以自由设置任何类型的值,如果换到 C/C++ 中则要写一大堆东西,正所谓 人生苦短,我用 python 啊, 为了更深入的理解 C,这份苦吃着也罢。
我们需要把一批数据打包,如鱼的名称,种类,牙齿,年龄,如果要打印它,在之前的章节中可以这样:
void showFish(const char *name, const char *species, int teeth, int age) { // const char *:表示将传递字符串字面值 printf("%s is a %s with %i teeth.He is %i\n", name, species, teeth, age); } int main(int argc, char *argv[]) { showFish("Snappy", "Piranha", 69, 4); return 0; }
如果使用结构可以把不同的类型写在一起,封装成一个新的大数据类型:
struct fish { const char *name; const char *species; int teeth; int age; }; // 不要忘了分号结尾
定义 struch fish
新结构后,开始创建数据:
struct fish snappy = {"Snappy", "Piranha", 69, 4};
那么上面的例子可以用结构体改写成:
struct fish { const char *name; const char *species; int teeth; int age; }; // 不要忘了分号结尾 void showPrettyFish(struct fish f) { printf("%s is a %s with %i teeth.He is %i\n", f.name, f.species, f.teeth, f.age); } int main(int argc, char *argv[]) { struct fish snappy = {"Snappy", "Piranha", 69, 4}; showPrettyFish(snappy); return 0; }
1.定义与声明
结构体的定义如下所示,struct 为结构体关键字,tag 为结构体的标志,member-list 为结构体成员列表,其必须列出其所有成员;variable-list 为此结构体声明的变量。
struct tag { member-list } variable-list ;
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为示例:
//此声明声明了拥有 3 个成员的结构体,分别为整型的 a,字符型的 b 和双精度的 c //同时又声明了结构体变量 s1 //这个结构体并没有标明其标签 struct { int a; char b; double c; } s1; //此声明声明了拥有 3 个成员的结构体,分别为整型的 a,字符型的 b 和双精度的 c //结构体的标签被命名为 SIMPLE,没有声明变量 struct SIMPLE { int a; char b; double c; }; //用 SIMPLE 标签的结构体,另外声明了变量 t1、t2、t3 struct SIMPLE t1, t2[20], *t3; //也可以用 typedef 创建新类型 typedef struct { int a; char b; double c; } Simple2; //现在可以用 Simple2 作为类型声明新的结构体变量 Simple2 u1, u2[20], *u3;
可以使用指定初始化器来设置结构字段的初值:
typedef struct { const char *color; int gears; int height; } bike; bike b = {.height=17, .gears=21};
2.结构体成员访问
结构体成员依据结构体变量类型的不同,一般有 2 种访问方式,一种为直接访问,一种为间接访问
struct SIMPLE { int a; char b; }; //声明结构体变量 s1 和指向结构体变量的指针 s2 struct SIMPLE s1, *s2; //给变量 s1 和 s2 的成员赋值,注意 s1.a 和 s2->a 并不是同一成员 //直接访问 s1.a = 5; s1.b = 6; //间接访问 s2->a = 3; s2->b = 4;
3.结构与存储器
定义结构时,存储器并没有创建任何东西,只是给了计算机一个模板,当定义新变量时,存储器为结构创建一块足够大的空间。那么当把一个结构变量赋给另一个结构变量时会发生什么?计算 机会创建一个新的结构副本,也就是说,计算机需要再分配一 块存储器空间,大小和原来相同,然后把每个字段都复制过去。
4.嵌套定义结构
定义嵌套结构是为了应付更加复杂的情况,如下:(注意嵌套结构的顺序)
//定义一个爱好规则结构 typedef struct { const char *species; // 种类 const char *rules; // 规则 } Rules; //定义一个爱好结构 typedef struct { const char *what; //爱好什么 Rules rl; //规则 } Like; //定义一个人的结构 typedef struct { const char *name; // 名字 int age; // 年龄 Like lk; // 爱好 } Person; int main(int argc, char *argv[]) { Person beginman = {"beginman", 24, {"游泳", {"有氧运动", "规则如下:蛙泳一个来回,水下憋气 10 分钟.."}}}; printf("%s is %i years old, he like %s(%s: %s)", beginman.name, beginman.age, beginman.lk.what, beginman.lk.rl.species, beginman.lk.rl.rules); return 0; }
5.更新结构
如下实例:
typedef struct { const char *name; int age; }turtle; void happy_birthday(turtle t) { t.age=100; printf("%i\n", t.age); } int main(int argc, char *argv[]) { turtle xx = {"龟龟", 99}; //更改年龄 happy_birthday(xx); printf("%i\n", xx.age); return 0; }
试图更改乌龟的年龄:输出结果:
100 99
why?在 C 中,参数按值传递给函数,当调用函数时,传入函数的值会赋值给形参,
void happy_birthday(turtle t) { ... } //myrtle 结构会复制给形参 happy_birthday(myrtle); //等效于: turtle t = myrtle;
在 C 语言中,当为结构赋值时,计算机会复制结构的值。如果想把结构传给函数并在函数中更新值,则需要结构指针。
因为只有把变量在存储器中的位置告诉函数,函数才能更新保存在那里的数据,才能更新变量。
所以上面的代码可以这样写:
void happy_birthday(turtle *t) { (*t).age=100; //要把*放在变量
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Make 让你编译智能化
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论