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

    老师的讲解:

    老师的代码:

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

  • 相关阅读:
    [书目20110210]信息系统项目管理师教程(第2版)目录
    [文摘2010220]投资人不可不知的股市法则
    生活是自我的选择和过滤
    [书目20110210]系统架构设计师教程 目录
    [转]6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
    [书目]给总经理的101条忠告
    项目管理工具 之 microsoft project help
    [文摘20110216]职业经理人必备十素质
    [文摘20110226]于丹的一百一十句人生忠告
    学习需要用心 规划和落实
  • 原文地址:https://www.cnblogs.com/accolade/p/12827439.html
Copyright © 2011-2022 走看看