C语言入门-结构类型
- 2019 年 10 月 18 日
- 笔记
一、声明结构类型
#include <stdio.h> int main(int argc, char const *argv[]) { // 声明结构类型 struct date { int month; int day; int year; }; // 使用自定义的类型 struct date today; today.month = 9; today.day = 30; today.year = 2019; printf("Today is date is %i-%i-%in", today.year , today.month, today.day); return 0; }
二、在函数内/外 ?
- 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
- 所以通常在函数外部声明结果类型,这样就可以被多个函数使用了
#include <stdio.h> struct date { int month; int day; int year; }; int main(int argc, char const *argv[]) { struct date today; today.month = 9; today.day = 30; today.year = 2019; printf("Today is date is %i-%i-%in", today.year , today.month, today.day); return 0; }
三、声明结构的形式
struct point{ int x; int y; } struct point p1,p2; // 其中p1和p2都是point // 里面有x和y的值
还有另外一种形式:
struct{ int x; int y }p1 , p2 ; // p1和p2都是一种无名结构,里面有x和y
当然了,还有一种更加常用的形式
struct point { int x; int y; }p1 , p2;
p1和p2都是point,里面有x和y的值
四、结构的初始化
struct date{ int month; int day; int year; }; int main(int argc, char const *argv[]) { struct date taday = {9 , 30 , 2019}; struct date thismonth = {.month=9 , .year=2019}; printf("Today is date is %i-%i-%in", taday.year,taday.month,taday.day ); printf("This month is %i-%i-%in", thismonth.year,thismonth.month,thismonth.day); return 0; } // Today is date is 2019-9-30 // This month is 2019-9-0
结构成员
- 结构和数组有点像
- 数组用[]运算符和下标访问其成员 a[10] = 10;
- 结构用“ . " 运算符和名字访问其成员 today.day , student.firstName
结构运算
- 要访问整个结构,直接用结构变量的名字
- 对于整个结构,可以做赋值、取地址、也可以传递给函数参数
- 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;
五、结构与函数
结构作为函数参数
int numberOfDays(struct date d);
- 整个结构可以作为参数的值传入函数
- 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
- 也可以返回一个结构
- 这与数组完全不同
输入结构
- 没有直接的方式可以一次scanf一个结构
- 如果我们打算写一个函数来读入结果
#include <stdio.h> struct point { int x; int y; }; void getStruct(struct point p); void output(struct point p); int main() { struct point y = {0,0}; getStruct(y); output(y); return 0; } void getStruct(struct point p){ scanf("%d" , &p.x); scanf("%d" , &p.y); printf("%d , %dn", p.x , p.y); } void output(struct point p) { printf("%d , %dn", p.x , p.y); } // 2 // 3 // 2 , 3 // 0 , 0
- 但是读入的结构如何送回来呢?
- 记住c语言函数在调用时是传值的,所以函数中的p与main中的y是不同的
解决的方案
- 之前的方案,把一个结构传入函数,然后在函数中操作,但是没有返回回去
- 问题在于传入函数的是外面那个结构体的克隆体,而不是指针
- 传入结构和传入数组是不同的
- 在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者,但这并不常用,了解即可
#include <stdio.h> struct point { int x; int y; }; struct point getStruct(void); void output(struct point p); int main() { struct point y = {0,0}; y = getStruct(); output(y); return 0; } // 这里返回一个struct struct point getStruct(void){ struct point p; scanf("%d" , &p.x); scanf("%d" , &p.y); printf("%d , %dn", p.x , p.y); return p; } void output(struct point p) { printf("%d , %dn", p.x , p.y); } // 5 6 // 5 , 6 // 5 , 6
- 最常用的就是结构指针作为参数
六、指向结构的指针
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 point* getStruct(struct point *p); void output(struct point p); void print(const struct point *p); int main(int argc, char const *argv[]) { struct point y = {0,0}; getStruct(&y); output(y); output(*getStruct(&y)); print(getStruct(&y)); return 0; } struct point* getStruct(struct point *p) { scanf("%d" , &p->x); scanf("%d" , &p->y); printf("%d , %dn", p->x , p->y); return p; } void output(struct point p) { printf("%d , %dn", p.x , p.y); } void print(const struct point *p) { printf("%d , %dn", p->x , p->y); }