内容简介:结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据类型struct [结构体类型] [结构体变量名] = {[结构体内参数实例化值]struct [结构体类型] [结构体变量名] ;
结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据类型
二、初始化结构体的变量
1. 第一种初始化方式
struct [结构体类型] [结构体变量名] = {[结构体内参数实例化值]
2. 第二种初始化方式
struct [结构体类型] [结构体变量名] ;
[结构体变量名].[结构体参数名] = [实例化值];
例如:
struct Man { char name[20]; int age; char* mobile; }; void main() { struct Man m1 = { "Jack",20 ,"18800008888"}; printf("%s,%d,%s\n", m1.name, m1.age,m1.mobile); //或 struct Man m2 ; //m2.name 数组类型不能直接复制 strcpy(m2.name, "Rose"); m2.age = 23; m2.mobile = "16600001111"; printf("%s,%d,%s\n", m2.name, m2.age,m2.mobile); getchar(); }
输出:
Jack,20,18800008888 Rose,23,16600001111
三、结构体的几种写法
1、第一种写法
例如:
struct Man{ char name[20]; int age; }; void main() { struct Man m1 = { "Jack",20}; printf("%s,%d\n", m1.name, m1.age); getchar(); }
2、第二种写法,可以在结构体类型的}后,定义结构体变量名,也可以对结构体变量名进行初始化。
例如:
struct Man { char* name; int age; } Man,m2={"jack",20}; void main() { Man.name = "Tom"; Man.age = 19; printf("%s,%d\n", Man.name,Man .age); getchar(); }
3、第三种写法:匿名结构体,控制结构体变量的个数(限量版),相当于单例
例如:
struct { char* name; int age; } Woman; void main() { Woman.name = "Lili"; Woman.age = 19; printf("%s,%d\n", Woman.name,Woman .age); getchar(); }
四、结构体嵌套
结构体是可以进行嵌套使用的,可以分别定义使用,或者在一个结构体中定义另一个结构体
1、分别定义结构体嵌套
例如:
// 老师的结构体 struct Teacher { char name[20]; }; // 学生的结构体 struct Student { char name[20]; int age; struct Teacher t; }; void main() { struct Student s1 = { "jack",21,{"Jason"} }; struct Student s2; strcpy(s2.name, "Tom"); s2.age = 23; strcpy(s2.t.name, "Jason"); getchar(); }
2、结构体内定义结构体嵌套
例如:
// 学生的结构体 struct Student { char name[20]; int age; // 老师的结构体 struct Teacher { char name[20]; } t; }; void main() { struct Student s1 = { "jack",21,{"Jason"} }; struct Student s2; strcpy(s2.name, "Tom"); s2.age = 23; strcpy(s2.t.name, "Jason"); getchar(); }
五、结构体与指针
结构体变量也可以使用指针进行操作,”p->”是”(*p).”的简写形式
例如:
struct Man{ char name[20]; int age; }; void main(){ struct Man m1 = {"Jack",30}; //结构体指针 struct Man *p = &m1; printf("%s,%d\n",(*p).name,(*p).age); //"p->"是"(*p)."的简写形式 printf("%s,%d\n",p->name,p->age); getchar(); }
六、结构体数组与指针
结构体变量也可以使用指针进行操作,”p->”是”(*p).”的简写形式
例如:
struct Man { char name[20]; int age; }; void main() { struct Man mans[] = { {"Jack",30},{"Rose",19} }; //遍历数组 struct Man *p = mans; for (; p < mans + 2; p++) { printf("%s,%d\n", p->name, p->age); } int i = 0; for (; i < sizeof(mans) / sizeof(struct Man); i++) { printf("%s,%d\n", mans[i].name, mans[i].age); } getchar(); }
七、结构体的大小(字节对齐)
结构体的大小必须是结构体中最宽基本数据类型的整数倍
牺牲一定的存储空间(本需要12字节的空间,实际分配16字节,(最宽基本数据类型的整数倍)),提升读取的效率
例如:
struct Man { int age; double weight; }; void main() { struct Man m1 = { 20,80.9 }; printf("%#x,%d\n", &m1,sizeof(m1)); getchar(); }
输出:
0xcffcc4,16
八、结构体与动态内存分配
struct Man{ char *name; int age; }; void main(){ struct Man *man_p = (struct Man*)malloc(sizeof(struct Man)*10); struct Man *p = man_p; //赋值 p->name = "Jack"; p->age = 20; p++; p->name = "Rose"; p->age = 23; struct Man *loop_p =man_p ; for(;loop_p < man_p+2;loop_p++){ printf("%s,%d\n",loop_p->name,loop_p->age); } free(man_p); getchar(); }
九、typedef 类型取别名
1、不同的名称代表在干不同的事情;typedef int jint;
2、不同的情况下,使用不同的别名
if(_cplusplus){ typedef _JNIEvn JNIEvn; typedef _JavaVM JavaVM; }
3、书写简洁
struct Man{ char *name; int age; }; //Age int 类型的别名 typedef int Age; //Ap int 类型指针的别名 typedef int* Ap; typedef struct Man JavaMan; typedef struct Man* JM; //简写 typedef struct Woman{ char name[20]; int age; } W,*WP;// W 是Woman结构体的别名;WP 是Woman结构体指针的别名。 void main(){ int i = 5; Ap p = &i; //结构体变量 W w1 = {"Rose",25}; //结构体指针 WP wp1 = &w1; printf("%s,%d\n",wp1->name,wp1->age); getchar(); }
十、结构体函数指针成员
#include <Windows.h> //Girl 结构体类似于 Java 中的类,name和age类似于属性,sayHi类似于方法 struct Girl{ char *name; int age; //函数指针 void(*sayHi) (char*); }; void sayHi(char* text){ MessageBoxA(0,text,"title",0); } void main(){ struct Girl g1; g1.name = "Lucy"; g1.age = 18; g1.sayHi = sayHi; g1.sayHi("Hello!"); getchar(); }
取别名的写法
#include <Windows.h> //Girl 结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法 typedef struct Girl{ char *name; int age; //函数指针 void(*sayHi) (char*); }Girl; //Girl结构体指针取别名 typedef Girl* GirlP; void sayHi(char* text){ MessageBoxA(0,text,"title",0); } void main(){ struct Girl g1 = {"Lucy",19,sayHi}; GirlP gp1 = &g1; gp1->sayHi("Hello"); getchar(); }
以上所述就是小编给大家介绍的《(四)C语言之结构体》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java语言精粹
Jim Waldo / 王江平 / 电子工业出版社 / 2011-6 / 39.00元
这是一本几乎只讲java优点的书。 Jim Waldo先生是原sun微系统公司实验室的杰出工程师,他亲历并参与了java从技术萌生、发展到崛起的整个过程。在这《java语言精粹》里,jim总结了他所认为的java语言及其环境的诸多精良部分,包括:类型系统、异常处理、包机制、垃圾回收、java虚拟机、javadoc、集合、远程方法调用和并发机制。另外,他还从开发者的角度分析了在java技术周围......一起来看看 《Java语言精粹》 这本书的介绍吧!
XML、JSON 在线转换
在线XML、JSON转换工具
HEX CMYK 转换工具
HEX CMYK 互转工具