------ Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------
http://www.itheima.com
- 结构体:不同类型数据组成的一种数据结构组织,它是一种构造类型。
- 结构体作用:有些问题仅用基本类型和数组来描述,无法反映其内在联系,如学生情况: 包括姓名、年龄、成绩等,结构体可以将其构造成一个整体,这个整体里面的数据既相互独立又相互关联。
- 结构体的定义:
类型说明符 成员名
类型说明符 成员名
.......
}
- 结构体变量定义:1、先定义结构,再定义结构变量:
char name[22];
float score;
int num;
};
struct student stu1;
2、在定义结构类型的同时定义结构变量:
struct student {
char name[22];
float score;
int num;
}stu1;
3、匿名结构体定义结构变量:struct {
char name[22];
float score;
int num;
}stu1;
注意点: 1、结构体类型与结构体变量概念不同,声明结构体类型时不分配存储单元,使用该类型定义变量时才分配存储单元。
2、结构体成员名与程序中变量名可相同,两者不代表同一个对象。
- 结构体变量的引用:结构变量名.成员名,结构体变量不能整体引用,只能引用变量成员。如果结构体成员本身又是一个结构体类型,则需要找到最低一级的成员,如:
struct student {
char name[22];
float score;
int num;
struct date {
int month;
int day;
int year;
}birthday;
}stu1;
访问形式:stu1.birthday.month=10;
- 结构体变量的初始化:
struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;
………….
};
struct 结构体名 结构体变量={初始化数据};
形式2:
struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;
…………
} 结构体变量={初始数据};
形式3:
struct { 类型标识符 成员名1;
类型标识符 成员名2;
…………
} 结构体变量={初始数据};
- 结构体作用域:根据作用域可以分为全局结构体、局部结构体。在函数的内部或者代码块的内部定义的结构体,称为局部结构体,其作用域从局部结构体定义的位置开始,到它所在的代码块或者函数体的“}”为止;在函数的外部定义的结构体是全局结构体,从定义的位置开始,到文件末尾,在不同的函数中都可以使用。
- 结构体数组:
概念:具有相同结构的结构体变量组成的数组。
直接定义:
struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;
…………
} 数组名[数组长度];
间接定义:
struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;
…………
};
struct 结构体名 数组名 [数组长度];
初始化:可以在定义结构体数组时初始化,也可以先定义结构体数组然后初始化。
- 结构体指针:
概念:指向结构体变量的指针。
定义形式: struct 结构体名 *结构体指针名; 注意:结构体指针变量中的值存放的是结构体变量在内存中的首地址;结构体指针加一将指向内存中下一个结构体。
结构体指针间接访问成员值:结构指针变量->成员名 或者 (*结构指针变量).成员名,注意:第二种访问形式括号不能省。
- 结构体变量以及成员变量值作为函数的参数实质上是值传递。
- 结构体指针作为函数参数是地址传递,如下面代码通过结构体指针间接访问来修改成员变量值:
#include <stdio.h>
struct Stu{
float score;
int age;
};
void test(structStu *c){
c->score = 98.4f;
}
int main(int argc,constchar * argv[]) {
//定义一个结构体变量并初始化
struct Stu stu={78.3f,23};
//定义结构体指针并初始化
struct Stu *p=&stu;
//结构体指针作为函数参数是地址传递
test(p);
printf("%.1f\n",stu.score);
return 0;
}