------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、构造类型及结构体
1、C语言构造类型
构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。 也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
在C语言中,构造类型有以下几种:
数组类型
结构体类型
共用体(联合)类型
2、什么是结构体?
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符 型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能 用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫 “结构体”。 它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定 义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
3、为什么要有结构类型?
结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若
传递参数较多,传一个结构体相对而言简单一些,很多系统自带的函数必须用结构体
二、定义结构体的方法
1、定义结构体的方法
定义一个结构的一般形式为:
struct 结构名
{
成员表列
};
//定义一个学生的结构
struct stu
{
int num;
char name[20]; //char *name;
char sex;
float score;
};
成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类 型说明,其形式为:
类型说明符 成员名;
成员名的命名应符合标识符的书写规定。
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义一个车的结构体
struct Car{
char *color;
int lunzi;
int speed;
};
//定义一个iPhone的结构体
struct iPhone{
char *color;
float screenSize;
int sn;
int imei;
};
//定义一个学生的结构体
struct Student{
char name[20];
char sex;
int age;
float score;
int sno;
};
return 0;
}</span>
三、结构体变量及定义方法
假设有学生结构如下:
//定义一个学生的结构
struct Student
{
int num;
char name[20];
char sex;
float score;
};
定义结构变量的格式。
struct 结构体名 结构体变量名1,结构体变量名2;
1、先定义结构,再说明结构变量。
也可以用宏定义使一个符号常量来表示一个结构类型。
#define STU struct stu
STU{
int num;
char name[20]; char sex;
float score;
};
STU boy1,boy2;
2、在定义结构类型的同时说明结构变量。
struct stu
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;
这种形式的说明的一般形式为:
struct 结构名
{
成员表列
}变量名表列;
3、匿名结构体定义结构变量。
struct
{
int num;
char name[20]; char sex;
float score;
}boy1,boy2;
这种形式的说明的一般形式为:
struct
{
成员表列
}变量名表列;
第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量,这种结构体最大的问题是,不能再次定义新的结构体变量了。
三种方法中说明的boy1、boy2变量都具有下图所示的结构。
<span style="font-size:14px;">#include <stdio.h>
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
};
int main(int argc, const char * argv[]) {
//第一种方法
struct Student stu1; //这句话表示定义一个Student结构体类型的变量,变量的名称是stu1;
//第二种,定义结构体的同时,定义结构体变量
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
}stu5,stu6,stu7; //也是用Student结构体定义了三个结构体变量
//名称分别为 stu5,stu6,stu7
struct {
char *color;
int lunzi;
int speed;
}car1,car2,car3;
return 0;
}</span>
四、结构体变量的初始化
1、先定义结构体变量,然后再初始化
struct stu
{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
boy1.num = 1010;
strcpy(boy1.name, "bbbbb");
//boy1.name="cjk";
//这是错误的
//相当于char name[20], name="abc";
//如果写成char *name, 则name="abc"可以;
boy1.sex = 'f';
boy1.score = 18.0f;
2、定义的同时初始化
1)全部初始化 定义结构体的时候直接初始化
#include <stdio.h>
#include <_string.h>
struct stu
{
int num;
char name[20];
char sex;
float score;
} av1={1012,"xzmly",'f',30};
//注意 "xzmly"初始化赋值给了name[20];
printf("av1.name=%s",av1.name); //初始化的顺序必须与结构体定义的时候成员的顺序一致
struct stu boy1={1011,"zbz",'f',23}; // 使用另外一已经存在的结构体初始化新的结构体
注意:两个相同类型的结构体变量的赋值,相当普通变量的赋
值,是整体拷贝,而不是地址赋值
2)部分初始化
struct stu boy1={.name="weige"};
<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
};
//先定义结构体变量,然后再初始化
struct Student stu1; //占用字节数?
//给结构体变变量初始化
stu1.sno = 38;
stu1.age = 18;
stu1.score = 59.99f;
char name1[21]="张三丰";
//name1 = "张无忌";
strcpy(stu1.name, "张三丰a");
printf("学号:%d\n年龄:%d\n分数:%.2f\n姓名:%s\n",stu1.sno,stu1.age,stu1.score,stu1.name);
//1、stu1.name 占用多个字节 21
printf("stu1.name %ld\n",sizeof(stu1.name));
//2、stu1.name 字符串长度是多少
//汉字的编码问题
// UTF-8 xcode中默认的中文的编码是utf-8格式
// 国际通用编码 一个汉字占用 3个字节
// GB2312 GBK 国标 一个汉字占用2个字节
printf("stu1.name 长度:%ld\n",strlen(stu1.name));
//2、定义结构体变量的同时,进行初始化
//初始化值得顺序要和定义结构体的顺序一致
struct Student stu2={8,"凤姐",18,49.99f};
printf("\n\n学号:%d\n年龄:%d\n分数:%.2f\n姓名:%s\n",stu2.sno,stu2.age,stu2.score,stu2.name);
//3、定义结构体的同时,还可以指定元素的初始化
struct Student stu3={.name = "lady Gaga"};
return 0;
}</span>
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------