AutoLeaders控制组——C语言结构体的学习笔记

结构体学习笔记

11.1枚举

当需要连续多个常量时,可以用枚举避免多个const int定义。

枚举格式:enum 枚举类型名称{名字0,……,名字n};

enum COLOR{RED,YELLOW,GREEN};
RED==0,YELLOW==1,GREEN==2

如果是连续的,可以最后定义一个number,因为正常是从0开始排,最后一个就是常量的个数:

enum COLOR{RED,YELLOW,GREEN,num};

如果需要,也可以直接给出常量的值:

enum COLOR{RED=1,YELLOW,GREEN=5};
​
RED==1;YELLOW==2,GREEN==5;

注意:

void f(enum color c); 作为参数时,对于C语言来说,必须要加上enum。

11.2结构

11.2-1结构类型

一个变量只能表示一个数据。如果要想让一个整体可以表示多个数据,就需要用到结构

1.结构类型声明:

struct date {
    int month;//成员变量,可以是不同类型
    int day;
    int year;
};//注意加分号
//结构类型声明不是实体,它相当于告诉程序有一个结构长这个样子,像一个模板
struct date today//定义结构变量,相当于把模板给它,是个实体。(一定要加上struct)
//结构变量可以有多个

与本地变量一样,如果在函数中声明结构类型,那么这个结构类型只能在函数中发挥作用。

因此一般都是在函数外声明结构类型,让其在任何地方都能用。

2.声明结构的形式:

1.struct point {        2.struct {                  3.struct point{
    int x;                  int x;                      int x;
    int y;                  int y;                      int y;
};                      }p1,p2;                     } p1,p2;
struct point p1,p2;     p1,p2是结构变量,且            声明和定义同时完成
p1,p2都是结构变量         该结构没有名字(只要          (常用)
                        p1,p2,不再用这个结构类型)    

3.结构的初始化:

struct date {
    int month;
    int day;
    int yeat;
};
struct date today ={07,31,2014};//按顺序赋值
struct date thismonth ={.month=7,.year=2014};//赋所给的值,没给值的系统会赋个0

4.结构成员和结构运算:

访问结构成员,用点运算符(.):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

5.结构指针:

结构变量的名字不是结构变量的地址,必须使用&运算符

struct date *pDate=&today;

11.2-2结构与函数

结构变量可以作为函数的参数将他的值(x,y……)传入函数,这时是在函数内新建一个结构变量,并进行复制。

也可以让函数返回一个结构。

int numberOfDays(struct date d)//使用时可以不用struct date

要实现一次输入结构变量里的值,可以用以下代码:

#include <stdio.h>
​
struct point {
    int x;
    int y;
};
struct point getStruct(void);
//getStruct函数,不用参数,因为输入的结构无法通过函数改变。
//所以直接在函数中定义结构变量,最后把它输出交给外面的结构变量
int main()
{
    struct point y={0,0};
    y=getStruct();
    printf("%d,%d",y.x,y.y);
    return 0;
}
​
struct point getStruct(void)
{
    struct point p;
    scanf("%d",&p.x);
    scanf("%d",&p.y);
    return p;   
} 

如果这个结构很大,传入函数时新建一个结构会费时间和空间,所以最好是传结构指针。

用->表示指针所指的结构变量的成员
    struct date *p=&myday;
本来:(*p).month=12;
简便化:p->month=12;

所以就可以优化getStruct函数:

struct point getStruct(struct point *p)
{
    struct point p;
    scanf("%d",&p->x);
    scanf("%d",&p->y);
    return p;   
} 
返回的是一个指针p,这个指针又能和*运算符结合,表示出原来的结构变量

11.2-3结构中的结构

1.结构数组:一个数组,每个单元都是一个结构

//struct date dates[100];
struct date dates[]={
    {4,5,2005},{2.4.2005}
};//最外面的括号是数组的初始化,里面的括号是结构的初始化,分别表示两个数组的值。

2.结构中的结构:

一个结构中的成员变量也可以是另一个结构:

struct DateAndTime {
    struct date sdate;
    struct time stime;
};

11.3联合

11.3-1类型定义

在定义一个结构变量是,我们总是要在变量前加上struct 结构名,减少了代码可读性。所以我们可以通过typedef来改善。

typedef可以给一个类型一个新的名字,这个名字为最后一个单词。(中间可能会有很多东西)

typedef int length;
则length a,b,len;==int a,b,len;

对于结构:

typedef struct ADate {  //此处可以不用结构名,因为会有新名字
    int month;
    int day;
    int year;
} Date;
//struct ADate结构的别名为Date,可以用Date替代struct ADate
Date d={9,1,2005}; 

11.3-2联合

联合用union表示,它和struct相似:

union AnElt {
    int i;
    char c;
} elt1,elt2;
​
elt1.i=4;
elr2.c='a';
elt2.i=0xDEADBEEF;

不同之处在于:

对于struct,两个成员的值是分开的,随时可以使用其中一个;

对于union,所有成员共同使用一个内存空间。任意时间内只能存放一个成员的值

对成员的值修改会对原有的值进行覆盖:

union的大小是其最大的成员,对其初始化只能是对第一个成员赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值