C语言_0328笔记_结构:常量符号化/int值/自定义枚举量/自动枚举计数/不怎么常用

目录

什么是结构?

11.2.1 结构类型

声明结构的形式

方法一:

 方法二:

 方法三:(常见)

结构变量

 结构变量初始化

结构成员

结构运算

结构指针


什么是结构?

想记录抽象物体的一连串数据,我们不想一个一个定义,此时就可以用到C语言的结构类型

一个结构就是一个复合类型,其中可以包含许多不同类型的成员变量

11.2.1 结构类型

struct date {

int month;

int day;

int year;

  • //struct 是关键字  打括号里面是结构的成员 
  • // 将来的每一个date里面都有这三个成员
  • #include ‹stdio.h>
    int main(int arg, char const *argv(])
    {
    struct date {
    int month;
    int day;
    int year;
    };
    struct date today;
    //使用结构类型,建立了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;
    }
  • 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,但如果在外部声明就可以被多个函数使用了。所以通常将结构声明的部分放在所有函数的外面
  • 和之前的枚举相似,使用时候需要带上struct关键字

声明结构的形式

方法一:

  1.  声明了一个结构名为point,创建了两个变量p1和p2
  2. 创建了两个变量p1和p2,p1和p2的类型是struct point 【p1和p2里面有x、y的值】
  3. 接下来就可以使用p1和p2变量做一些事情了
struct point{
int x;
int y;
};
struct point p1,p2;
 
//声明了一个结构名为point,创建了两个变量p1和p2

 方法二:

  1. //声明了一个结构但没有名字,创建了两个变量p1和p2
  2. //p1和p2都是无名结构,有x和y值
  3. //当你只需要在当下使用两个变量,可以用这种不起名字的方式
struct {
int x;
int y;
}p1,p2;
 
//声明了一个结构但没有名字,创建了两个变量p1和p2
//p1和p2都是无名结构,有x和y值
//当你只需要在当下使用两个变量,可以用这种不起名字的方式

 方法三:(常见)

  1.  声明了一个结构名为point,创建了两个变量p1和p2
  2. 定义了结构的变量,p1和p2都是point,内部有x和y的值
struct point{
int x;
int y;
}p1,p2;

结构变量

示例:

struct date today;

today.month=06;

today.day=19;

today.year=2005;

  • 于是today这个变量中就有三个int类型。函数外声明的部分是在声明一种新类型,而函数内是在定义这种类型的变量。声明后就可以按模板创建多个不同变量,内部含有day、year等等。

 结构变量初始化

我们创建一个结构变量之后,它在函数内部,是一个本地变量,没有初始值。因为有前车之鉴,不赋初始值就会给予乱七八糟的内存值。那如何给它赋初值呢?

struct date{
    int month;
    int day;
    int year;  
};
 
int main()
{
    struct date today = {07,31,2014};
//一种就是按声明的顺序依次赋值
    struct date thismonth = {.month=7, .year=2014 };
    //类似数组,没给day赋值,自动赋0
}

结构成员

  • 结构成员与数组成员类似,但数组成员类型必须相同,结构成员则不需要
  • 成员访问方式不同,数组通过方括号[]和下标(方括号里的数字),而结构通过点(.)和名字来访问
  • 注意,出现在【.】的左边的一定是结构变量(实体),结构类型是虚的,只是告诉编译器有这么一个类型

    eg:a[0]=10;

    today.day\p1.x 

结构运算

  • 要访问整个结构,直接用结构变量的名字
  • 整个结构可以做赋值、取地址,也可以传递给函数参数
  • 以下的两种操作,数组都是不能完成的
    • day=today;结果是相同的;but!!! 数组不能俩数组直接相等
    • 若再更改day、today的值,二者不同,说明这是两个不同的、单独的变量
p1=(struct point){5,10};
//(struct point 是强制类型转换,将5,10强制转换为point结构变量)
//相当于p1.x=5, p1.y=10
 
p1=p2;
//相当于p1.x = p2.x, p1.y = p2.y

例子:

#include<stdio.h>
 
struct date{
    int month;
    int day;
    int year;
};
 
int main()
{
    struct date today;
    today = (struct date){07,31,2014};
//给today赋值
    struct date day;
 
    day=today;//数组不能做相等!!!
//让day=today,分别打印
    printf("Today's date is %i-%i-%i.\n",
    today.year,today.month,today.day);
 
    printf("The day's date is %i-%i-%i.\n",
    today.year,today.month,today.day);
}

结构指针

 数组的本质就是指针,但结构变量不是,所以它的名字不能用来当做地址,需要用&运算符。

struct date *pDate = &today

 这时创建了一个指针指向了today变量 

(养成好习惯,取地址都用&)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值