一、声明结构类型

#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-%i\n", today.year , today.month, today.day); return 0;
}

二、在函数内/外 ?

  1. 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
  2. 所以通常在函数外部声明结果类型,这样就可以被多个函数使用了
#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-%i\n", 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-%i\n", taday.year,taday.month,taday.day );
printf("This month is %i-%i-%i\n", thismonth.year,thismonth.month,thismonth.day); return 0;
}
// Today is date is 2019-9-30
// This month is 2019-9-0

结构成员

  1. 结构和数组有点像
  2. 数组用[]运算符和下标访问其成员 a[10] = 10;
  3. 结构用“ . " 运算符和名字访问其成员 today.day , student.firstName

结构运算

  1. 要访问整个结构,直接用结构变量的名字
  2. 对于整个结构,可以做赋值、取地址、也可以传递给函数参数
  3. p1 = (struct point) {5,10} ; 等于 p1.x = 5 , p1.y = 10;
  4. p1 = p2 ; 等于 p1.x = p2.x ; p1.y = p2.y;

结构指针

  1. 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
  2. struct date *pDate = &today;

五、结构与函数

结构作为函数参数

int numberOfDays(struct date d);
  1. 整个结构可以作为参数的值传入函数
  2. 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
  3. 也可以返回一个结构
  4. 这与数组完全不同

输入结构

  1. 没有直接的方式可以一次scanf一个结构
  2. 如果我们打算写一个函数来读入结果
#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 , %d\n", p.x , p.y);
} void output(struct point p)
{
printf("%d , %d\n", p.x , p.y);
} // 2
// 3
// 2 , 3
// 0 , 0
  1. 但是读入的结构如何送回来呢?
  2. 记住c语言函数在调用时是传值的,所以函数中的p与main中的y是不同的

解决的方案

  1. 之前的方案,把一个结构传入函数,然后在函数中操作,但是没有返回回去

    • 问题在于传入函数的是外面那个结构体的克隆体,而不是指针
    • 传入结构和传入数组是不同的
  2. 在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者,但这并不常用,了解即可
#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 , %d\n", p.x , p.y);
return p;
} void output(struct point p)
{
printf("%d , %d\n", p.x , p.y);
} // 5 6
// 5 , 6
// 5 , 6
  1. 最常用的就是结构指针作为参数

六、指向结构的指针

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 , %d\n", p->x , p->y);
return p;
} void output(struct point p)
{
printf("%d , %d\n", p.x , p.y);
} void print(const struct point *p)
{
printf("%d , %d\n", p->x , p->y);
}

最新文章

  1. 介绍几种SSIS部署方式
  2. JS简介,如何快熟JS。打下结实基础。
  3. 3d效果的图片轮播
  4. VIM 常用命令
  5. 使用 yum 安装 virtualbox 虚拟机
  6. fiddler如何修改request header
  7. Jquery与CSS选择器参考手册
  8. MySQL按照汉字的拼音排序,mysql汉字排序
  9. maven pox.xml 设置主入口配置节点
  10. samba服务搭建及管理
  11. ContextMenuOpening 事件
  12. [MySQL]快速解决&quot;is marked as crashed and should be repaired&quot;故障
  13. asp.net中Get请求和Post请求
  14. mysql 数据库查询与实例。
  15. 【BBST 之伸展树 (Splay Tree)】
  16. HDU 5455 Fang Fang 水题,但题意描述有问题
  17. Spring配置中&lt;context:annotation-config&gt; VS &lt;context:component-scan&gt;
  18. Swift基础之实现下拉变大和OC下拉变大上拉缩小Demo
  19. 各组对本组——《BBW》软件开发意见的汇总
  20. MySQL在默认事务下各SQL语句使用的锁分析

热门文章

  1. 分库分表之后,id 主键如何处理?
  2. .NET Core 3.0 Preview 9 发布
  3. Android 图片处理之 Fresco
  4. UGUI_关卡选项界面
  5. jupyter lab(notebook)相关配置
  6. 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
  7. 装系统------- 了解常用的启动方式以及如何进入bios
  8. 取html里的img和去html标签
  9. prometheus-operator告警模块alertmanager注意事项(QQ邮箱发送告警)--大大坑
  10. scrapy框架来爬取壁纸网站并将图片下载到本地文件中