C语言回顾(八、结构体,联合/共用体,枚举)——iOS开发基础

说明:
在学习UI高级知识之前,将利用最近十来天的时间回顾一下C语言,主要按照《C程序设计(谭浩强版)》来回顾。
整理一些知识点(不是细节,知识个人觉得较重要或易忘的)以及挑一些课后题目或经典习题编写代码练习。

第9章 用户自己建立数据类型

1、结构体:用户自己建立由不同类型数据组成的组合体的数据结构
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。

#include <stdio.h>

struct Date {
    int month;
    int day;
};

struct Student {
    char name[20];
    int age;
    char sex;
    struct Date Birthday;   //成员可以属于另一个结构体
}student1 = {"Nong Chaozhe",21,'M',{2,18}}; //定义结构体并初始化

int main(int argc, const char * argv[]) {
    struct Student student2 = student1; //同类结构体可以相互赋值
    int age = 10; //结构体中成员们可以与程序中变量名相同,但不代表同一个对象

    printf("student1:%s,%d岁,%c,%d月%d日\n",student1.name,student1.age,student1.sex,student1.Birthday.month,student1.Birthday.day);    //输出数据

    //结构体数组
    struct Date festival[3] = {1,1,{5,1},10,1};    //结构体数组,逗号,按顺序赋值,加不加括号都可以
    printf("元旦:%d.%d\n",festival[0].month,festival[0].day);

    //结构体指针
    struct Student *p = NULL;
    p = &student2;
    printf("student2:%s,%d岁,%c,%d月%d日\n",(*p).name,p->age,p->sex,(*p).Birthday.month,(*p).Birthday.day);    //指针变量两种访问成员变量的方式,还有一种就是student2.name

    //指向结构体数组的指针
    struct Date *p1 = NULL;
    for (p1 = festival; p1 < festival+3; p1++) {
        printf("节日:%d.%d\n",p1->month,p1->day);
    }           //p1+1意味着p1所增加的值为结构体数组festival一个元素所占的字节,指向festival[1];

// 结构体变量或结构体变量的指针作函数参数
// 与之前的数组等等都类似,不作累述

    printf("%lu\n",sizeof(student1));
// 根据结构体情况占37个字节 (20+4+1+(2*4)=33),但是结果是36
// 因为计算机对内存的管理是以“字”为单元的(一般4个字节1个字)。如果一个字只存放一个字符占一个字节,但该字中得其他3个字节不会接着存放下一个数据,而会从下一个字开始存放,因此得到的不是33,而是36。结果必然是4的倍数。

    return 0;
}

output:

student1:Nong Chaozhe,21岁,M,2月18日
元旦:1.1
student2:Nong Chaozhe,21岁,M,2月18日
节日:1.1
节日:5.1
节日:10.1
36

2、共用体/联合:使几个不同的变量共享同一段内存的结构
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。

#include <stdio.h>

union Data {
    int i;
    char ch;
    float f;
}a = {97};             //可以在声明类型同时定义变量,对第一个成员初始化
//错误!:a = {1,'a',1.5} 不能同时初始化3个成员
//共用体是同一内存段用来存放几种不同类型的成员,但每一瞬间只能存其中一个成员,而不是同时存放几个,重复情况下后赋值会覆盖前者

int main(int argc, const char * argv[]) {
    printf("%d\n",a.i);     //输出整数97
    printf("%c\n",a.ch);    //输出字符‘a’
    printf("%f\n",a.f);     //输出实数0.0000
// 初始化97赋值给a.i,按整数型是存储在变量单元中,最后一个字节是“01100001”。上面三种输出只是对变量单元内的东西按照不同形式输出而已。

    union Data b = {.ch = 'A'}; //也可以对指定成员进行初始化
    b.f = 1.5;
    b.i = 121;
    printf("%c\n",b.ch);        //输出的不是‘A’,而是最后存入的121对应的ASCII值

    b = a;                      //同类型的共用体变量互相赋值

    printf("%p,%p,%p,%p\n",&a,&a.i,&a.ch,&a.f);   //4个地址相同

    printf("%lu\n",sizeof(a));  //共用体变量所占的内存长度为最长的成员的长度
    return 0;
}

output:

97
a
0.000000
y
0x100001018,0x100001018,0x100001018,0x100001018
4

3、枚举:把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。enum开头。
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。

#include <stdio.h>

typedef enum {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}Weekday;   //利用typedef定义新类型名


int main(int argc, const char * argv[]) {
    Weekday date = Monday;
// 等价于 date = 0;因为每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认他们的值为0,1,2,3,4,5……
    printf("%d\n",date); //输出‘0’
// 既然是数字,那么不同的枚举元素之间是可以比较=,>,<,==等等的
    if (date == Monday) {
        printf("Yes\n");
    }
    return 0;
}

output:

0
Yes

你可能感兴趣的:(枚举,C语言,结构体,共用体,ios开发基础)