------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----
一、c语言构造类型
构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
在c语言中,构造类型有以下几种:
数组类型
结构体类型
共用体(联合)类型
二、什么是结构体? //用来存储若干个类型相同或类型不同的数据,把这些东西构造在一起。
“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构即是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
三、定义结构体的方法
1、定义结构体的方法:
定义一个结构的一般形式为:
struct 结构体{
成员表列
};
//定义一个学生的结构
struct stu{
int num;
char name[20]; //char *name;
char sex;
float score;
};
1 /* 2 构造类型: 3 4 由一个或者多个已定义类型的元素用构造的方法,构造新的类型 5 6 构造类型: 7 8 数组 结构体 9 10 结构体: 11 12 由相同类型或者不同类型的数据用构造方法,构造的类型 13 14 结构体的定义: 15 16 struct 结构体名 { 17 18 成员列表; 19 20 }; 21 // 比如要定义一个汽车的结构体 22 23 struct Car { 24 25 char *color; 26 int lunzi; 27 int speed; 28 }; 29 30 // 定义一个iPhone的结构体 31 32 struct iPhone { 33 34 char *color; 35 float screenSize; 36 int sn; 37 int imei; 38 }; 39 40 //定义一个学生的结构体 41 42 struct Student{ 43 44 char name[20]; 45 char sex; 46 int age; 47 float score; 48 int sno; 49 }; 50 51 */
第二讲 结构体变量及定义方法
本小节知识点:
1、先定义结构,再说明结构变量
2、在定义结构类型的同时说明结构变量
3、匿名结构体定义结构体变量
1 /* 2 结构体变量定义有三种方法 3 4 1)先定义结构体,然后再定义结构体变量 5 struct Student{ 6 7 //学生学号 8 int sno; 9 //学生姓名 10 char name[20]; 11 //学生年龄 12 int age; 13 //学生成绩 14 float score; 15 }; 16 17 //注意: 18 1、结构体定义完成以后,计算机并不会给结构体分配内存空间 19 2、会在定义结构体变量后,分配存储空间 20 21 //结构体变量定义格式: 22 struct 结构体名 结构体变量名; 23 24 struct Student stu1; // 这句话表示一个Student结构体类型的变量,变量的名称是stu; 25 26 //stu因为是Student类型,stu可以存放学生的学号,姓名,年龄,成绩 27 28 struct Student stu2,stu3,stu4; // 定义多个结构体变量 29 30 31 2)定义结构体的同时,定义结构体变量 32 33 格式: 34 35 struct 结构体名{ 36 37 38 };结构体变量1,结构体变量2....; 39 40 struct Student{ 41 42 //学生学号 43 int sno; 44 //学生姓名 45 char name[20]; 46 //学生年龄 47 int age; 48 //学生成绩 49 float score; 50 }stu5,stu6,stu7; //也是用Student结构体定义了三个结构体变量 51 //名称分别为 stu5,stu6,stu7 52 53 54 3)使用匿名结构体定义结构体变量 55 56 struct { 57 58 59 }结构体变量1,结构体变量2....; 60 61 struct { 62 63 char *color; 64 int lunzi; 65 int speed; 66 67 }car1,car2,car3; 68 */ 69
第三讲 结构体变量中成员的访问方法
1.结构变量中成员的访问方法
表示结构变量成员的一般形式是:
结构变量名.成员名
#include <stdio.h>
int main (int argc , const char * argv[]) {
//定义一个Car类型的结构体
struct Car{
char *pp;
int lunzi;
int speed;
};
//用结构体类型,定义结构体变量
struct Car car1;
/* 可以存储
car1
pp "奥拓"
lunzi 4
speed 350
car2
pp "时风"
lunzi 3
speed 180
*/
//获取结构体变量中的成员
//获取品牌 car1.pp
//获取轮子 car1.lunzi
//获取速度 car1.speed
//访问时风 car2.pp
return 0;
}
第四讲 结构体变量的初始化
1 #include <stdio.h>
2 #include <string.h>
3 int main (int argc , const char * argv[]) {
4
5 struct Student{
6
7 //学生学号
8 int sno;
9 //学生姓名
10 char name[21];
11 //学生年龄
12 int age;
13 //学生成绩
14 float score;
15 };
16
17 //一、先定义结构体变量,然后再初始化
18 struct Student stu1;
19
20 //给结构体变量初始化
21 stu1.sno = 38;
22 stu1.age = 18;
23 stu1.score = 59.99f;
24 char name1[21] = "张三丰";
25 // name1 = "张无忌"; //数组名是一个常量 不能赋值
26 strcpy(stu1.name,"张三丰");
27 // stu1.name = "张三丰"; //
28
29 printf("学号: %d\n年龄: %d\n分数: %.2f\n姓名: %s\n",stu1.sno,stu1.age,stu1.score,stu1.name);
30
31 //1、stu1.name 占用多少个字节
32 printf("stu1.name %ld\n",sizeof(stu1.name));
33 //2、stu1.name 字符串长度是多少
34 //汉字的编码问题
35 //UTF-8 xcode默认的中文的编码utf-8格式
36 // 国际通用编码 一个汉字占用3个字节
37 //GB2312 GBK 国标 一个汉字占用2个字节
38 printf("stu1.name 长度: %ld\n",strlen(stu1.name));
39
40
41 //二、定义结构体变量的同时,然后再初始化
42 //初始化值得顺序要和定义结构体的顺序一致
43 struct Student stu2={8,"凤姐",18,59.99f};
44 printf("学号: %d\n年龄: %d\n分数: %.2f\n姓名: %s\n",stu2.sno,stu2.age,stu2.score,stu2.name);
45
46
47 //三、定义结构体的同时,还可以指定元素的初始化
48 struct Student stu3={.name = "lady Gaga"};
49 printf("%s\n",stu3.name);
50
51 return 0;
52 }
第五讲 结构体变量储存原理
1、结构体存储原理
结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题)。
2、结构体数据成员对齐的意义
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对期模数(alignment modulus)。
这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。
3、结构体对齐的含义
1)结构体总长度
2)结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置。
第六讲 结构体变量占用存储空间大小
1、结构体大小的计算方法和步骤
#include <stdio.h>
int main (int argc , const char * argv[]) {
//计算结构体变量在内存中占用的字节数的方法
//1)先找对齐模数
//对齐模数 是结构体中的基本数据类型中占用字节数最大的那个
// 结构体的长度应该是该模数的整数倍
//2)在计算结构体变量中各个成员占用的字节和
struct A{
char ch[13]; // k =4 4 16 16-13= 3
char ch1[11]; // 2 8 11-3 =8
int a; // 1 4
}; // 28
//定义结构体变量
struct A a1;
printf("%ld\n",sizeof(a1));
return 0;
}
第七讲 结构体作用域
1、作用域概述
结构体类型定义在函数内部的作用域与局部变量的作用域是相同的
函数外部定义的结构体类型类似全局变量
全局作用域:从定义的那一行开始直到本文件结束为止。
2、作用域分类
结构体根据作用域可以分为全局结构体和局部结构体。
#include <stdio.h>
//定义一个全局的结构体
struct Person{
int age;
char *name;
};
int main (int argc , const char * argv[]) {
//定义结构体变量
struct Person p1 = {18,"胡一刀"};
printf("age = %d\nname = %s\n",p1.age,p1.name);
//此处是可以的
char *str = "aa";
str = "bbb";
p1.name = "苗人凤";
printf("name = %s\n",p1.name);
struct Person p2;
p2.name = "胡斐";
printf("name = %s\n",p2.name);
//定义了一个结构体
//定义一个局部的结构体,这个结构体和全局的结构体同名
struct Person{
int age;
};
//此处定义的p3 是局部结构体Person的类型
struct Person p3;
// p3.name = "胡斐"; 局部的把全局的覆盖了
// printf("name = %s\n",p3.name);
return 0;
}
原文:http://www.cnblogs.com/xiaokang520/p/5062333.html