登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 结构(下)

[复制链接]
发表于 2018-2-18 14:19:37 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C语言
学习安排: 结构数组,typedef,联合(union)
开始时间: 2018-02-18
结束时间:
这是一个使用结构数组的例子,总得来说没有什么特别的地方,
感觉有点像是二维数组
#include<stdio.h>

struct time{
    int hour;
    int minutes;
    int seconds;
};

struct time timeUpdate(struct time now);

int main()
{
    struct time testTimes[5] = {
        {11,59,59},{12,0,0},{1,29,59},{23,59,59},{19,12,27}
    };
    int i;

    for( i=0; i<5; ++i ){
        printf("time is %2i:%2i:%2i\n",
               testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);

        testTimes[i] = timeUpdate(testTimes[i]);

        printf("...one second later it's time is %2i:%2i:%2i\n",
               testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);
    }

    return 0;
}

struct time timeUpdate(struct time now){
    ++now.seconds;
    if(now.seconds == 60){
        now.minutes++;
        now.seconds=0;
    }
    if(now.minutes == 60){
        now.hour++;
        now.minutes=0;
    }
    return now;
}
结构中的结构
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;

如果有变量定义
struct rectangle r ,*rp;
rp=&r;

那么下面四种形式就是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x

联合
typedef
声明新的类型的名字
    新的名字是某种类型的名别
    改善了程序的可读性

本来是以为C语言学到指针,去学单片机就没什么问题了
之前在学单片机矩阵按键的时候,遇到了很大的困难
找不到程序的问题在哪里,逻辑也没有问题,还遇到了一些很奇怪的问题
于是找了社团的程序,发现社团的程序有很多地方看不懂
比如程序中的 uint8 等等,于是决定C语言需要继续学下去,
然后结合社团的程序重新学单片机,虽然时间可能不太够,
但是,寒假能学多少就多少吧

typedef int length;
这句话的意思就是,以后 length 也可以代表 int
以后程序中只要出现 length 表示的就是 int
length a,b,len;
length number[10];
完全可以这样

typedef long int64;
这样 int64 就是long这个型别了;
可以增强可读性

typedef struct adate{
    int month;
    int day;
    int year;
}date;
上面这几行程序的意思是
struct adate{
    int month;
    int day;
    int year;
};这部分是一个结构,它的名字是date,
以后date就是一个有month,有day,有year的一个结构了
我们可以直接
date d = {9,1,2013};
可以每次用到 struct date时直接将 struct 省略

再举一个例子
typedef char* strings[10];
表示的是strings是十个字符串数组的类型
这里的strings不再是数组了,而是一个类型

联合 union
union AnElt{
    int i;
    char c;
}elt1,elt2;

看上去好像和 struct 没有什么不同,我们照样可以对它做赋值
elt1.i = 4;
elt2.c = 'a';
elt2.i = 0xdeadbeef;

实际上,union AnElt{
    int i;
    char c;
}elt1,elt2;,这里的 i 和 c 是公用一个内存的,
感觉就好像是申请的一段内存,这段内存由这个联合内的成员共同使用
并且同一时间只能存其中一个成员的值

那这段空间有多长?
这段空间的长度是 这个联合中 长度最长的型别的整数倍
举个例子
union foo{
    int i;
    long j;
    char f;
}bar;

这里 bar 就是这个联合的名字,里面有 i , j , f
而这个联合所占的空间, 是 long 的整数倍,这个例子中就是 8个字节

union foo{
    int i;
    char j[10];
}bar;
这个联合所占的空间是 12 是 int 的长度的三倍,而不是 j[10] 的长度
如果,我们将这里的 int ,换成 long 那这个联合的长度就是 16
是 long 的 2 倍

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表