zoukankan      html  css  js  c++  java
  • 10枚举,结构,联合

    前言:好吧,字符串这章这些函数估计后面又要重新熟悉,毕竟函数有点多。

    返回主页:https://www.cnblogs.com/accolade/p/12289618.html

    枚举,结构,联合

    枚举

     枚举使用是必需带上enum 枚举类型的名字 名字,怎么感觉有点烦呢。

    随便写的代码

    #include<stdio.h>
    #include<stdbool.h>
    #include<string.h>
    enum color{red,green,yellow,white,colornum};
    int iamyoudada(enum color c);
    int main(int argc,const char *argv[]){
        
        char *colorchar[]={"red","green","yellow","white"};
        for(int i=0;i <= colornum;i++){
            printf("%d:red=%d
    ",i,red);
        }
    
        int Nm;
        enum color b = 3;
        Nm=iamyoudada(b);
        printf("the result of returnning form funtion iamyoudada:%d
    ",Nm);
        printf("%d
    ",red);
    }
    int iamyoudada(enum color c){
        printf("here is the funtion:iamyoudada and the input info is %d
    ",c);
        return 1;
    }

    注意:

    enum color{red,green,yellow,white,colornum};
    int iamyoudada(enum color c);

    申明函数是,这个枚举必需也要写在外面,好奇怪。不然就会有报错。改了1个小时。

    看下老师的代码:

     

     上面的代码只能这么写,我是过直接去改原始enum就会报错。

    由于枚举就是const int,所以函数直接可以穿参数进去。看下面的代码

    #include<stdio.h>
    #include<stdbool.h>
    #include<string.h>
    
    int f(int a);
    int main(int argc,const char *argv[]){
        enum color { red, green, white};
    
        f(red);
    }
    int f(int a){
        printf("i am the funtion :f
    a=%d
    ",a);
    }
    i am the funtion :f
    a=0

    枚举的小套路

     有时间自己写一下。

    结构类型

     

     是不是很像python里面的面向对象,但是没有可以调用的函数。所有还是遗憾的。

    有趣的现象,如果int没有声明的话,便会变成了默认为0,请看下面的代码:

     结构运算

     但是如果是赋值的话,全部都赋值过来了

     指针的结构

     

     输出:

    注意,函数如果传的如果是值,那么修改不会修改到外面结构的属性,如下:

     

     解决方案

     当然,这种方法如果结构太大的话,就不可取了。所以我们推荐下面的一种方案。指针传参,先看下下面这句话,翻译一下

     注意:在定义函数是,结构体一定要写在函数上面,因为我感觉这是从上面玩下面开始编译,如果你没有定义结构,就会报错。开始没注意,一直报错。调了好久就发现这个问题了。

    请看代码:

    #include<stdio.h>
    #include<string.h>
    
    struct person{
            char name[200];
            int age;
            char sex[100];
        };
    void outputinfoname(struct person a);// print struct person's info,such as name,age,sex
    void outputinfo(struct person *a);//change person info
    
    int main(int argc ,char const *argv[]){
        
        struct person xiaoming;
        xiaoming.age = 15;
        strcpy(xiaoming.name,"xiaoming");
        strcpy(xiaoming.sex,"male");
        outputinfoname(xiaoming);
        struct person *xiaoming1 = &xiaoming;
        outputinfo(xiaoming1);//pass a argument of pointer
        outputinfoname(xiaoming);
    
        return 0;
    }
    void outputinfo(struct person *a){
       strcpy(a->name,"xiaoming111");
       strcpy(a->sex,"female");
       a->age = 22;
     
    }
    void outputinfoname(struct person a){
        printf("%s.name=%s
    ",a.name,a.name);
        printf("%s.sex=%s
    ",a.name,a.sex);
        printf("%s.age=%d
    ",a.name,a.age);
    } 

    输出结果:

    xiaoming.name=xiaoming
    xiaoming.sex=male
    xiaoming.age=15
    xiaoming111.name=xiaoming111
    xiaoming111.sex=female
    xiaoming111.age=22

     指向结构的指针

     结构数组与结构中的结构

     

     这个可以拿去做线性表(链式结构),二叉树,中序遍历等等,后面有时间可以试一下。

     

     

     typeof起别名

     

     

    由于前面我已经学习过了,所以就全部贴图了,但是注意的是可以同时起两个别名,一般有一个表示指针。 

    例如把上面的代码改成这样:

    #include<stdio.h>
    #include<string.h>
    
    typedef struct person{
            char name[200];
            int age;
            char sex[100];
        } xiaomingone ,*xiaomingtwo;
    void outputinfoname(struct person a);// print struct person's info,such as name,age,sex
    void outputinfo(struct person *a);//change person info
    
    int main(int argc ,char const *argv[]){
        xiaomingone xiaoming;  //typedef of othername
        xiaoming.age = 15;
        strcpy(xiaoming.name,"xiaoming");
        strcpy(xiaoming.sex,"male");
        outputinfoname(xiaoming);
        xiaomingtwo xiaoming1 = &xiaoming;//typeded of pointer 
        outputinfo(xiaoming1);//pass a argument of pointer
        outputinfoname(xiaoming);
    
        return 0;
    }
    void outputinfo(struct person *a){
       strcpy(a->name,"xiaoming111");
       strcpy(a->sex,"female");
       a->age = 22;
     
    }
    void outputinfoname(struct person a){
        printf("%s.name=%s
    ",a.name,a.name);
        printf("%s.sex=%s
    ",a.name,a.sex);
        printf("%s.age=%d
    ",a.name,a.age);
    }

    在调用是,不用加上*了,相当于直接给个地址呢然后你再把这个地址填上你需要的指针

    联合

    就是说其实里面只有一个共享的空间,虽然以我现在的水平不知道这个有什么作用,但是我们可以知道我们inter CPU是基于X86结构,也就是基于小端储存的,请看代码

    #include<stdio.h>
    #include<string.h>
    
    
    
    int main(int argc ,char const *argv[]){
        union person{
            int age;
            char name[sizeof(int)];
        } xiaofang;
        printf("sizeof(int)=%d
    ",sizeof(int));
        xiaofang.age = 1234;
        for(int i=0;i < sizeof(int);i++){
            printf("%02hhx ",xiaofang.name[i]);
        };
    
        return 0;
    }

    输出的结果:

    sizeof(int)=4
    ffd2 04 00 00

    老师的讲解:

    老师的代码:

     也说明小端结果也是以字节为单位储存的。

  • 相关阅读:
    python--模块与包
    内置函数 的总结
    迭代器 生成器 列表推导式 生成器表达式的一些总结
    函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数
    函数名的应用(第一对象) 闭包 装饰器
    动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
    函数的初识 函数的返回值 参数
    文件操作 常用操作方法 文件的修改
    遍历字典的集中方法 集合的作用 以及增删查的方法
    计算机硬件的小知识
  • 原文地址:https://www.cnblogs.com/accolade/p/12827439.html
Copyright © 2011-2022 走看看