目录
结构体类型
- 定义结构体的一般形式为:
struct 结构体名{
成员列表
};
在成员表列中可以是几种基本数据类型,也可以是结构体数据类型。struct 类型名{} 变量;后的分号不能漏。
声明结构的形式
形式1:
struct point{
int x;
int y;
};struct point p1,p2;
p1和p2都是point里面有x和y的值
形式2:struct{
int x;
int y;
}p1,p2;p1和p2都是一种无名结构,里面有x和y
形式3:
struct point{
int x;
int y;
};struct point p1,p2;
p1和p2都是point里面有x和y的值t
对于第一和第三种形式,都声明了结构point。但是第二种形式没有声名point,只是定义了两个变量
例子:
#include<stdio.h>
int main(int argc, char const *argv[])
{
struct date{
int month;
int day;
int year;
};
struct date 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;
}
结构成员
- 数组用[]运算符和下标访问其成员,a[0]=10
- 结构用.运算符和名字访问其成员,形式<结构体类型变量名>.<成员名>,如today.day student.firstName p1.x p1.y
结构运算
- 要访问整个结构,直接用结构变量的名字
- 对于整个结构,可以做赋值、取地址,也可以传递给结构参数,如:
- p1=(struct point){5,10};//相当于p1.x=5;p1.y=10;
- p1=p2; //相当于p1.x=p2.x;p1.y=p2.y;
结构指针
- 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
- struct date*pDate=&today;
结构体与函数
结构作为函数参数
- 整个结构可以作为参数的值传入函数
- 这时候是在函数内新建一个结构变量,并赋值调用者的结构的值
- 也可以返回一个结构
- 和数组不同
输入结构
- C语言在函数调用的时候是传值的
- 传入结构和传入数组是不同的
例子:
#include<stdio.h>
struct point{
int x;
int y;
};
void getStruct(struct point);
void output(struct point);
void main(){
struct point y={0,0};
getStruct(y);
output(y);}
void getStruct(struct point p){
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("%d,%d",p.x,p.y);}
void output(struct point p){
printf("%d,%d",p.x,p.y);}
结构体与指针
定义形式:struct 结构体名 *结构体指针名
指向结构的指针
struct date{
int month;
int day;
int year;
}myday;struct date *p=&myday;
(*p).month=12;
p->month=12;
用->表示指针所指的结构变量中的成员
结构体数组
嵌套的结构
struct point{
int x;
int y;
};
struct rectangle{
struct point p1;
struct point p2;
};如果有变量struct rectangle r;就可以有:
r.pt1.x、r.pt1.y,r.pt2.x和r.pt2.y
如果变量有定义:
struct rectangle r,*rp;
rp=&r;
那么下面的四种形式是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
d
但是没有rp->pt1->x(因为pt1不是指针)
typedef(自定义数据类型)
- C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字。比如:typedef int Length;
- 使得Length称为int类型的别名。
- 这样,Length这个名字就又可以代替int出现在变量定义和参数声明的地方了:
- Length a,b,len;
- Length numbers[10];
typedef声明新的类型的名字
- 新的名字是某种类型的别名
- 改善了程序的可读性
typedef long int64_t;
typedef struct ADate {
int month;
int day;
int year;
}Date;
int64_t i=100000000000;
Date d={9,1,2005};