标签:
/* * 22.结构体.c * * Created on: 2015年7月9日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 结构体:对共性数据的封装 * 结构体有点使用面向对象的思想,对一类东西的共性进行封闭,以便使用。 * * 定义结构体: * //1>定义结构体,也可以定义在函数中(全局与局部的结构体) struct Person{ char *name;// 字符串 int age; double hiegth; }; //有分号结尾 2>:定义一个结构体时并创建一个结构体变量 struct Person { char *name; // 字符串 int age; double hiegth; } p; 3>:没有名字的结构体,只能使用一次 struct { char *name; // 字符串 int age; double hiegth; } p; * */ //---------结构体的基本定义与使用----------------------------------- //定义结构体,也可以定义在函数中(全局与局部的结构体) struct Person { char *name; // 字符串 int age; double hiegth; }; //有分号结尾 void use_struct() { //创建构造体变量 struct Person p = { "zhong", 18, 159.0 }; //创建构造体时并赋初值(只有在创建时才可以使用{}赋值) p.age = 19; p.hiegth = 170.0; //可以使用变量名.结构体的字体名引用结构体中的数据段 printf("%d\n", sizeof(p.name)); //4 指针4个字节 printf("%d\n", sizeof(p.age)); //4 printf("%d\n", sizeof(p.hiegth)); //8 printf("%d\n", sizeof(p)); //结构体的总大小 :16 4+4+8 各字段之和(计算出的和要是只大字段的陪数,不够保够:) //如: 结构体中最有 int age, char c;现个字段 ,它们的总字节应该是 4+1=5。 //因为不是4的陪数,所以补够8,输出结构体的大小 为8 printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth); } //----------结构体的嵌套定义------------------------ /** * 结构体的嵌套定义,就是一个结构体包含另一个结构体: * 例如:使用结构体Date来封装日期数据 * 使用person_来封装一个人的信息,人的信息有生日,生日是一个日期,可以用上面定义的结构体Date来定义 */ //使用结构体Date来封装日期数据 struct Date{ int year; //年 int month; //月 int day; //日 }; // 使用person_来封装一个人的信息 struct Person_{ char *name;//性名 struct Date birthday; }; //测试 void n_struct(){ //定义结构体Person_的变量,并初始化 struct Person_ p={"zhong",{2015,7,9}}; //访问结构体中结构体的数据 printf("p.birthday.year=%d\n",p.birthday.year); p.birthday.year=2016; //修改数据 printf("p.birthday.year=%d\n",p.birthday.year); } //------结构体数组----------------------------- void struct_array(){ //定义结构体数组和定义普通数组一样,都是"类型名 变量名[大小]" struct Person persons[10]={ //定义结构体数组时并赋值 {"zhong1",18,174.0}, {"zhong2",19,175.0}, {"zhong3",20,176.0} }; //读取一个结构体并复制给变量p,修改p中的数据,数组中的数组不受影响 struct Person p=persons[0]; p.age=20;//修改p中的数据,数组中的数组不受影响 int age=p.age;//读取数据 printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth); //直接用数组下标引用字段,这样修改数据时,才会修改数组中的数据 persons[0].age=20; // int age=persons[0].age; //遍历输出 int i; for(i=0;i<3;i++){ struct Person p=persons[i]; printf("p p.age=%d,p.name=%s,p.hiegth=%f\n", p.age, p.name, p.hiegth); } } //-------指向结构体的指针----------------------- void p_struct(){ //定义一个结构体 struct Student{ int id; int age; }; //定义一个结构体变量存放结构体 struct Student s={01,19}; //定义一个结构体指针(把struct Student看成一个整体,一种类型),并指向结构体变量s struct Student *p=&s; //利用指针修改数据,下面两个方式都可以 (*p).id=2; p->id=3; //利用指针访问结构体 printf("s.id=%d,s.age=%d\n",(*p).id,(*p).age); //也可以写成这个样子 printf("s.id=%d,s.age=%d\n",p->id,p->age);//p前面不用加 * ,用eclipse编写代码时,只要p.age,就会自动变成 p->age //当然还可以写成这样 printf("s.id=%d,s.age=%d\n",s.id,s.age);//p前面不用加 * ,用eclipse编写代码时,只要p.age,就会自动变成 p->age } int main() { // use_struct(); // struct_array(); // p_struct(); n_struct(); // int a=1; // int *p=&a; // printf("%p\n",&a);//28ff44 // printf("%p\n",p);//28ff44 return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u014352836/article/details/46821663