NDK开发–C语言(结构体及结构体指针)

今天我们一起来认识一下C语言中的另外一个核心内容:结构体及结构体指针,咋一听是不是觉得有点独特?由于C语言是面向过程的语言,不像C++ ,Java等是面试对象的,所以结构体就有点类似于class类一样的。下面进入正题:

系统源码中大部分是typedef 开始定义的结构体,这样写是为了代码统一,所以我们下面都按照系统源码的风格来写,至于其他的写法,就看各位看官的喜好了.

开胃菜:枚举:(使用关键字 enum)

说明:

1) 定义的格式

           **typedef  enum  {**

                   **枚举值1 ,**

                      **枚举值2,**

                    **...**

                   **}   枚举名;**

2) 枚举的值都是int类型的。

      **如果没有赋值,则默认是从0 开始,依次+1 ;**

      **如果全部赋值,则使用设置的值;**

      **如果是部分赋值,则未赋值的枚举则会根据最近的上面的一个枚举值进行+1来赋值;**

**简单理解:赋值了用赋的值,未赋值的依次+1**

//自定义枚举
typedef enum {
    t=10,
    t1=20,
    t2,
    t3=40,
}CustomEnum;

int main(){
    CustomEnum  d=t3;
    printf("t3= %d
",d);
    return 0;
}

输出结果:40

重头戏:结构体及其指针

说明:

1)需要使用关键字 struct 来声明结构体变量,通过 点运算符来操作结构体成员;

2)可以在声明结构体时,直接声明变量并给变量赋值;

3)结构体嵌套使用;

          **3.1)在对嵌套的结构体进行初始化,使用花括号{}来对内部嵌套的结构体进行分割并初始化**

          **3.2)调用结构体内部嵌套的结构体时,可以直接使用点运算符来操作内部结构体变量**

4)结构体指针使用->访问成员;

5)使用typedef 来给结构体取别名,方便兼容和扩展

一、结构体的定义和使用

示例代码:

struct Dog {
    char *name;
    int age;
    char color;
};

int main(){
    
    struct Dog dog;
    dog.color =  r ;
    dog.name = "dog";
    dog.age = 12;
    printf("dog结构体的单独赋值:name=%s,age=%d,color=%c
", dog.name, dog.age, dog.color);
    
    return 0;
}



//输出结果: dog结构体的单独赋值:name=dog,age=12,color=r

二、结构体嵌套并直接声明变量

示例代码:

struct Student {
    char *name;


    struct HomeTown {
        char *province;
        char *city;
        char *country;
        char *detailStreet;
    } Home;

    //课程结构体
    struct Course {
        char *courseName;
        char *teacher;
    } Course;
} Zhangsan = {"张三",
              {"四川省",
               "成都市",
               "高新区",
               "xxxxx"
              },
              {"语文课",
               "李老师"}
};

int main(){
    //声明结构体时声明
    printf("Student结构体声明时定义变量:student name= %s,来自:%s-%s-%s-%s,课程是:%s-%s
",
           Zhangsan.name,
           Zhangsan.Home.province,
           Zhangsan.Home.city,
           Zhangsan.Home.country,
           Zhangsan.Home.detailStreet,
           Zhangsan.Course.courseName,
           Zhangsan.Course.teacher);
    return 0;
}



//输出结果: Student结构体声明时定义变量:student name= 张三,来自:四川省-成都市-高新区-xxxxx,课程是:语文课-李老师

三、结构体在堆栈区开辟

说明:

1) 自定义了结构体类型后,在后续的使用中通过struct+结构体名 来使用;

2)堆区开辟的结构体指针,需要free掉;

示例代码:

struct Dog {
    char *name;
    int age;
    char color;
};

int main(){
    
    //定义一条狗
     struct Dog dog;
    dog.color =  r ;
    dog.name = "dog";
    dog.age = 12;
    
    //结构体指针:栈区开辟空间
    struct Dog *dog1 = &dog;
    dog1->name = "dog1";
    dog1->age = 5;
    dog1->color =  b ;
    printf("dog1结构体指针的单独赋值:name=%s,age=%d,color=%c
",
           dog1->name, dog1->age, dog1->color);
    
    //结构体指针:堆区开辟
    struct Dog *dog2 = malloc(sizeof(struct Dog));
    dog2->name = "堆区dog";
    dog2->age = 3;
    dog2->color =  y ;
    printf("dog2结构体指针的单独赋值:name=%s,age=%d,color=%c
",
           dog2->name, dog2->age, dog2->color);
    free(dog2);
    dog2=NULL;
    
    return 0;
}


//输出结果:
//dog1结构体指针的单独赋值:name=dog1,age=5,color=b
//dog2结构体指针的单独赋值:name=堆区dog,age=3,color=y

四、结构体数组

示例代码:

struct Dog {
    char *name;
    int age;
    char color;
};

int main(){
    struct Dog nDog;
    struct Dog* redDog= &nDog;
    redDog->name="red dog";
    redDog->age=2;
    redDog->color= r ;
    
    struct Dog *blackDog = malloc(sizeof(struct Dog));
    blackDog->name="black Dog";
    blackDog->age=3;
    blackDog->color= b ;
    
     struct Dog* dogs[]={
            redDog,
            blackDog,
    };
    
     printf("下面输出结构体数组的内容:
");

    for (int i = 0; i < 2; ++i) {
        printf("数组第%d个元素是:%s---%c----%d
",i+1,dogs[i]->name,dogs[i]->color,dogs[i]->age);
    }
    
    printf("--------------下面输出数组的默认第一个元素
");
    printf("数组第一个元素的默认输出是:%s---%c----%d
",(*dogs)->name,(*dogs)->color,(*dogs)->age);

    free(blackDog);
    blackDog=NULL;
    

    return 0;
}   


//输出结果:
//下面输出结构体数组的内容:
//数组第1个元素是:red dog---r----2
//数组第2个元素是:black Dog---b----3
//--------------下面输出数组的默认第一个元素
//数组第一个元素的默认输出是:red dog---r----2

温馨提示:

C语言中的结构体,大家用面向对象编程语言的数据bean来协助理解,会觉得挺容易的

下节预告:C语言之字符串操作

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
trick7l的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容