美文网首页NDK开发
NDK开发--C语言(结构体及结构体指针)

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

作者: 初夏的雪 | 来源:发表于2021-06-11 09:50 被阅读0次

今天我们一起来认识一下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\n",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\n", 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\n",
           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\n",
           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\n",
           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("下面输出结构体数组的内容:\n");

    for (int i = 0; i < 2; ++i) {
        printf("数组第%d个元素是:%s---%c----%d\n",i+1,dogs[i]->name,dogs[i]->color,dogs[i]->age);
    }
    
    printf("--------------下面输出数组的默认第一个元素\n");
    printf("数组第一个元素的默认输出是:%s---%c----%d\n",(*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语言之字符串操作

相关文章

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

    今天我们一起来认识一下C语言中的另外一个核心内容:结构体及结构体指针,咋一听是不是觉得有点独特?因为C语言是面向过...

  • C语言20 结构体指针

    C语言20 结构体指针 探测结构体指针的特性 ++、-- 加法与减法 指针相减 使用结构体指针 结构体指针一定要指...

  • C语言基础及指针⑧文件IO

    接续上篇C语言基础及指针⑦结构体与指针在结构体与指针中 , 我们了解到结构体与java中的类相似 , 也是一种自定...

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • Golang 指针和结构体

    Golang 指针和结构体 于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一...

  • c语言 2018-05-29

    c语言文件结构 (-> and .) 定义结构体指针,访问成员时就用->定义结构体变量,访问成员时就用.例如:ty...

  • 6.结构体相关

    一 C 结构体和结构体指针 eg1: 一 结构体里面定义函数 通过结构体指针访问结构体里面定义的函数。 eg2:

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • C语言基础及指针⑦结构体与指针

    接续上篇C语言基础及指针⑥字符操作 如果说类是java中结构化数据类型的核心 , 那么结构体就是C语言中结构化数据...

  • C语言结构体指针

网友评论

    本文标题:NDK开发--C语言(结构体及结构体指针)

    本文链接:https://www.haomeiwen.com/subject/huxyjltx.html