(四)C语言之结构体

作者: onestravel | 来源:发表于2019-03-06 18:28 被阅读22次

(四)C语言之结构体

一、什么是结构体

结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据类型

二、初始化结构体的变量

1. 第一种初始化方式

struct [结构体类型] [结构体变量名] = {[结构体内参数实例化值]

2. 第二种初始化方式

struct [结构体类型] [结构体变量名] ;

[结构体变量名].[结构体参数名] = [实例化值];

例如:

struct Man
{
    char name[20];
    int age;
    char* mobile;
    
};
void main() {
    struct Man m1 = { "Jack",20 ,"18800008888"};
    printf("%s,%d,%s\n", m1.name, m1.age,m1.mobile);
    //或
    struct Man m2 ;
    //m2.name 数组类型不能直接复制
    strcpy(m2.name, "Rose");
    m2.age = 23;
    m2.mobile = "16600001111";
    printf("%s,%d,%s\n", m2.name, m2.age,m2.mobile);
    getchar();
}

输出:

Jack,20,18800008888
Rose,23,16600001111

三、结构体的几种写法

1、第一种写法

例如:

struct Man{
    char name[20];
    int age;
};
void main() {
    struct Man m1 = { "Jack",20};
    printf("%s,%d\n", m1.name, m1.age);
    getchar();
}

2、第二种写法,可以在结构体类型的}后,定义结构体变量名,也可以对结构体变量名进行初始化。

例如:

struct Man {
    char* name;
    int age;
} Man,m2={"jack",20};

void main() {
    Man.name = "Tom";
    Man.age = 19;
    printf("%s,%d\n", Man.name,Man
    .age);
    getchar();
}

3、第三种写法:匿名结构体,控制结构体变量的个数(限量版),相当于单例

例如:

struct  {
    char* name;
    int age;
} Woman;

void main() {
    Woman.name = "Lili";
    Woman.age = 19;
    printf("%s,%d\n", Woman.name,Woman
    .age);
    getchar();
}

四、结构体嵌套

结构体是可以进行嵌套使用的,可以分别定义使用,或者在一个结构体中定义另一个结构体

1、分别定义结构体嵌套

例如:

// 老师的结构体
struct Teacher {
    char name[20];
};

// 学生的结构体
struct Student {
    char name[20];
    int age;
    struct Teacher t;
};

void main() {
    struct Student s1 = { "jack",21,{"Jason"} };
    struct Student s2;
    strcpy(s2.name, "Tom");
    s2.age = 23;
    strcpy(s2.t.name, "Jason");
    getchar();
}

2、结构体内定义结构体嵌套

例如:

// 学生的结构体
struct Student {
    char name[20];
    int age;
    // 老师的结构体
    struct Teacher {
        char name[20];
    } t;
};

void main() {
    struct Student s1 = { "jack",21,{"Jason"} };
    struct Student s2;
    strcpy(s2.name, "Tom");
    s2.age = 23;
    strcpy(s2.t.name, "Jason");
    getchar();
}

五、结构体与指针

结构体变量也可以使用指针进行操作,"p->"是"(*p)."的简写形式

例如:

struct Man{
    char name[20];
    int age;
};

void main(){
    struct Man m1 = {"Jack",30};
    //结构体指针
    struct Man *p = &m1;
    printf("%s,%d\n",(*p).name,(*p).age);
    //"p->"是"(*p)."的简写形式
    printf("%s,%d\n",p->name,p->age);
    getchar();
}

六、结构体数组与指针

结构体变量也可以使用指针进行操作,"p->"是"(*p)."的简写形式

例如:

struct Man {
    char name[20];
    int age;
};

void main() {
    struct Man mans[] = { {"Jack",30},{"Rose",19} };
    //遍历数组
    struct Man *p = mans;
    for (; p < mans + 2; p++) {
        printf("%s,%d\n", p->name, p->age);
    }

    int i = 0;
    for (; i < sizeof(mans) / sizeof(struct Man); i++) {
        printf("%s,%d\n", mans[i].name, mans[i].age);
    }
    getchar();
}

七、结构体的大小(字节对齐)

结构体的大小必须是结构体中最宽基本数据类型的整数倍

牺牲一定的存储空间(本需要12字节的空间,实际分配16字节,(最宽基本数据类型的整数倍)),提升读取的效率

例如:

struct Man {
    int age;
    double weight;
};

void main() {
    struct Man m1 = { 20,80.9 };
    printf("%#x,%d\n", &m1,sizeof(m1));
    getchar();
}

输出:

0xcffcc4,16

八、结构体与动态内存分配

struct Man{
    char *name;
    int age;
};

void main(){
    struct Man *man_p = (struct Man*)malloc(sizeof(struct Man)*10);
    struct Man *p = man_p;
    //赋值
    p->name = "Jack";
    p->age = 20;
    p++;
    p->name = "Rose";
    p->age = 23;
    
    struct Man *loop_p =man_p  ;
    for(;loop_p < man_p+2;loop_p++){
        printf("%s,%d\n",loop_p->name,loop_p->age);
    }
    free(man_p);
    getchar();
}

九、typedef 类型取别名

1、不同的名称代表在干不同的事情;typedef int jint;

2、不同的情况下,使用不同的别名

if(_cplusplus){
    typedef _JNIEvn JNIEvn;
    typedef _JavaVM JavaVM;

}

3、书写简洁

struct Man{
    char *name;
    int age;
};


//Age  int 类型的别名
typedef int Age;
//Ap int 类型指针的别名
typedef int* Ap;

typedef struct Man JavaMan;
typedef struct Man* JM;
//简写
typedef struct Woman{
    char name[20];
    int age;
} W,*WP;// W 是Woman结构体的别名;WP 是Woman结构体指针的别名。


void main(){
    int i = 5;
    Ap p = &i;
    //结构体变量
    W w1 = {"Rose",25};
    //结构体指针
    WP wp1 = &w1;
    
    printf("%s,%d\n",wp1->name,wp1->age);
    getchar(); 
}

十、结构体函数指针成员

#include <Windows.h>
//Girl 结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi) (char*);
};

void sayHi(char* text){
    MessageBoxA(0,text,"title",0);
}

void main(){
   struct Girl g1;
   g1.name = "Lucy";
   g1.age = 18;
   g1.sayHi = sayHi;
   
   g1.sayHi("Hello!");
   getchar(); 
}

取别名的写法

#include <Windows.h>
//Girl 结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
typedef struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi) (char*);
}Girl;

//Girl结构体指针取别名
typedef Girl* GirlP;

void sayHi(char* text){
    MessageBoxA(0,text,"title",0);
}

void main(){
   struct Girl g1 = {"Lucy",19,sayHi};
   GirlP gp1 = &g1;
   gp1->sayHi("Hello");
   getchar(); 
}

相关文章

  • (四)C语言之结构体

    (四)C语言之结构体 一、什么是结构体 结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据...

  • C 语言之结构体

    一. 结构体定义 结构体类型的定义需要用到关键字struct,student是结构体类型名,大括号中的变量声明表示...

  • C语言之结构体(struct)

    结构体,怎么理解? 你可以把它想象成一个桌面上的文件夹,这个文件夹里面可以有各种各样的文件,当然也还可以再有文件夹...

  • 505,iOS __bridge那些事

    Objective-C 与 C语言之间的转换 C语言的结构体(struct或union)成员中,如果存在Objec...

  • C语言基础6

    结构体概述 1 在C语言中,结构体(struct)指的是一种数据结构,是C语 言中构造类型的其中之一。 2 在实际...

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

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

  • c语言中的结构体

    1、结构体的声明(1)结构体的关键词是struct第一种声明 第二种声明 第三种声明 2、结构体定义变量在C++语...

  • 《The Big Nerd Ranch Guide》笔记1

    一、C结构体与Objective-C类之间: 共同点:C结构体是一块内存,对象也是一块内存。C结构体有数据成员,每...

  • c语言中的结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 闲聊C语言结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

网友评论

    本文标题:(四)C语言之结构体

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