目录
解决方法(二):结构指针作为参数
11.2.1 结构类型
想记录抽象物体的一连串数据,我们不想一个一个定义,此时就可以用到C语言的结构类型
一个结构就是一个复合类型,其中可以包含许多不同类型的成员变量
#include ‹stdio.h>
int main(int arg, char const *argv(])
{
struct date {
int month;
int day;
int year;
};
struct date today;
//使用结构类型,建立了today结构变量
today.month = 07;
today. day = 31;
today. year = 2014;
printf ("Today's date is %i-i-%i.\n"
today. year, today.month, today. day|
return 0;
}
- 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,但如果在外部声明就可以被多个函数使用了。所以通常将结构声明的部分放在所有函数的外面
- 和之前的枚举相似,使用时候需要带上struct关键字
声明结构的形式
struct point{
int x;
int y;
};
struct point p1,p2;
//声明了一个结构名为point,创建了两个变量p1和p2
struct {
int x;
int y;
}p1,p2;
//声明了一个结构但没有名字,创建了两个变量p1和p2
//p1和p2都是无名结构,有x和y值
//当你只需要在当下使用两个变量,可以用这种不起名字的方式
第三种是更加常见的做法
struct point{
int x;
int y;
}p1,p2;
//声明了一个结构名为point,创建了两个变量p1和p2
//p1和p2都是point,内部有x和y的值
示例:
struct date today;
today.month=06;
today.day=19;
today.year=2005;
于是today这个变量中就有三个int类型。函数外声明的部分是在声明一种新类型,而函数内是在定义这种类型的变量。声明后就可以按模板创建多个不同变量,内部含有day、year等等。
结构变量初始化
我们创建一个结构变量之后,它在函数内部,是一个本地变量,没有初始值。因为有前车之鉴,不赋初始值就会给予乱七八糟的内存值。那如何给它赋初值呢?
struct date{
int month;
int day;
int year;
};
int main()
{
struct date today = {07,31,2014};
//一种就是按声明的顺序依次赋值
struct date thismonth = {.month=7, .year=2014 };
//类似数组,没给day赋值,自动赋0
//另一种是用点运算符来特定赋值
}
结构成员
- 结构成员与数组成员类似,但数组成员类型必须相同,结构成员则不需要
- 成员访问方式不同,数组通过方括号[]和下标(方括号里的数字),而结构通过点(.)和名字来访问
- eg:a[0]=10;
- today.day\p1.x
结构运算
- 要访问整个结构,直接用结构变量的名字
- 整个结构可以做赋值、取地址,也可以传递给函数参数
-
p1=(struct point){5,10}; //(struct point 是强制类型转换,将5,10强制转换为point结构变量) //相当于p1.x=5, p1.y=10 p1=p2; //相当于p1.x = p2.x, p1.y = p2.y
- (以上的两种操作,数组都是不能完成的)
#include