C语言学习笔记(4)
结构
1.结构类型
-
函数内/外声明结果类型的区别
和本地变量一样,在函数内部声明的结构类型只能在函数内部使用;
所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了;
(全局变量与局部变量) -
声明结构类型
struct point { int x; int y; }; struct pooint p1, p2; //p1和p2都是point,里面有x和y值
struct { int x; int y; }p1,p2; //P1和p2都是point,里面有x和y的值
struct point { int x; int y; }p1, p2; //p1和p2都是point,里面有x和y的值
-
结构变量:声明了结构类型后用这种类型定义不同的结构变量
struct date today; today.month = 07; today.day = 23; today.year = 2001;
-
结构初始化
struct date today = {07, 23, 2001};
struct date thismonth = {.month = 07, .year = 2001};
未给day赋值则*day为0;
-
结构成员
-
结构和数组有点像
-
数组的单元必须是相同类型的,而结构的成员可以是不同类型的
-
结构用 “ . ”运算符和名字访问其成员
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;
-
-
结构指针
和数组不同,结构变量的名字并不是结构的地址,必须使用“&”运算符;
strict date *pDate = &today;
- 用*p访问结构成员
- 用指向运算符->访问指针指向的结构成员
2.结构与函数
-
结构作为函数参数
int numberOfDays (struct date d)
- 整个结构可以作为参数的值传入函数;
- 这时候是在函数内新建一个结构变量,并复制调用者的结构的值;
- 也可以返回一个结构;这与数组完全不同;
-
输入结构
- 没有直接的方式可以一次scanf一个结构;
- C在函数调用时是传值的,在函数中p与main中的y是不同的,在函数读入了p的数值后,没有任何东西回到main,所以y还是
- 可以创建一个临时的结构变量,然后把这个结构返回给调用者
-
结构指针作为参数
-
指向结构的指针
struct date { int month; int day; int year; }myday; struct date *p = &myday; (*p).month = 12; p -> month = 12; //用->表示指针所指结构变量中的成员
-
3.结构中的结构
-
结构数组
struct date dates[100]; struct date dates[] = {{4.5.2005},{2,4,2005}};
-
结构中的结构
struct dateAndTime{ struct date sdate; struct time stime; };
-
结构中的结构
struct point{ int x; int y; }; struct rectangle{ struct point pt1; struct point pt2; }; //如果有变量struct rectangle r; //就可以有 r.pt1.x和r.pt1.y // r.pt2.x和r.pt2.y
我的手写笔记
MOOC代码
我的问题
- 运算优先级:
- 解决:初级运算符( )、[ ]、->、. 高于 单目运算符 高于 算数运算符(先乘除后加减) 高于 关系运算符 高于 逻辑运算符(不包括!) 高于 条件运算符 高于 赋值运算符 高于 逗号运算符。
- 为什么可以返回结构:
- 解决:C 语言中函数返回结构体时如果结构体较大, 则在调用函数中产生该结构的临时变量,并将该变量首地址传递给被调用函数,被调用函数返回时根据该地址修改此临时变量的内容,之后在调用函数中再将该变量复制给用户定义的变量,这也正是 C 语言中所谓值传递的工作方式。如果结构体较小, 则函数返回时所用的临时变量可保存在寄存器中,返回后将寄存器的值复制给用户定义的变量即可。
PTA问题
- 结构类型和结构变量是否占用内存?
- 解决:结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。定义一个结构体一般是不分配内存,声明一个结构体变量是分配内存的。