结构体

结构体

  • 结构体是一种构造数据类型
  • 把不同的数据类型整合起来成为一个自定义的数据类型
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Windows.h>
struct People{
    //成员
    char name[20];
    int age;
}
void main(){
    //初始化结构体的变量
    //1.
    struct People p = {"flower"18}; 
    //2.
    struct People p1;
    p1.name = "flower";
    p1.age = 18;
    strcpy(p1.name, "rose");
    sprintf(m1.name, "lisa");
    //类似JavaScript字面量赋值,只能在变量声明时赋值
    struct People p2 = p1;
    printf("%s, %d\n", p1.name, p1.age);
    getchar();
}

结构体的几种写法

struct People{
    char name[20];
    int age;
}p1, p2 = {"morning", 20};//p1结构体变量名
void main(){
    strcpy(p1.name, "rose");
    p1.age = 10;
    printf("%s, %d\n", p2.name, p2.age);
    getchar();
}

匿名结构体

控制结构体变量的个数,相当于单例

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

结构体嵌套

a

struct People{
    char name[20];
}

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

void main(){
    //字面量的方式
    struct Man m = {"man", 10, {"people"}};
    struct Man m1;
    m1.age = 15;
    strcpy(m1.p.name, "rose");
    system("pause");
}   

b

struct Man{
    char name[20];
    int age;
    struct People{
        char name[20];
    } p;
}
void main(){
    struct Man m;
    strcpy(m.p.name, "rose");
    //struct People p;
    system("pause");
}

结构体与指针

struct Man{
    char name[20],
    int age;
};
void main(){
    struct Man m = {"jason", 18};
    //结构体指针
    struct Man *p = &m;
    printf("%s, %d\n", m.name, m.age);
    printf("%s, %d\n", (*p).name, (*p).age);
    //"->""(*p)."的简写形式
    printf("%s, %d\n", p->name, p->age);
    //(*env) ->
    system("pause");
}

指针与结构体数组

struct Man{
    char name[20];
    int age;
};
void main(){
    struct Man mans[] = {{"one", 10}, {"two", 20}};
    //遍历结构体数组
    //1.
    struct Man *p = mans;
    for(; p < mans + 2; p++){
        printf("%s, %d\n", p->name, p->age);
    }

    //2.
    int i = 0;
    for(; i <sizeof(mas)/sizeof(struct Man); i++){
        printf("%s, %d\n", mans[i].name, mans[i].age);
    }
    //(*env)->
    system("pause");
}

结构体大小(字节对齐)

struct Man{
    int age;
    double weight;
};
void main(){
    //结构体变量的大小,必须是最基本数据类型的整数倍
    //提升读取的效率
    struct Man m1 = {20, 10.0};
    printf("%#x, %d\n", &m1, sizeof(m1));
    getchar();
}

结构体与动态内存分配

struct Man{
    char *name;
    int age;
}
void mian(){
    struct Man *m = (struct Man*)malloc(sizeof(struct Man) * 10);
    struct Man *p = m;
    //赋值
    p->name = "rose";
    p->age = 10;
    p++;
    p->name = "lufei";
    p->age = 20;
    struct Man *loop_p = m;
    for(;loop_p < m + 2; loop_p++){
        printf("%s, %d\n", loop_p->name, loop_p->age);
    }
    free(m);
    getchar();
}

typedef 类型取别名

1.不同名称代表在干不同的事情typedef int jint;
2.不同情况下,使用不同的别名

if defined(__cplusplus)
#typedef _JNIEnv JNIEvn;
#typedef _JavaVM JavaVM;

//3.书写简洁

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

//Age int类型的别名
typedef int Age;
//Age int 类型指针的别名
typedef int* Ap;
typedef struct Man JavaMan;
typedef struct struct Man* JM;

//结构体取别名
typedef struct Woman W;
typedef struct Woman* WP;
//简写
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", 10};
    //结构体指针
    WP wp1 = &w1;
    printf("%s, %d\n", w1.name, w1.age);
    printf("%s, %d\n", wp1->name, wp1->age);
    getchar();
}

结构体函数指针成员

struct Man{
    char *name;
    int age;
    //函数指针
    void(*toEat)(char*);
}

//Man类似于Java中的类,name和age类似于属性,toEat类似于方法
void toEat(char *text){
    MessageBoxA(0, text, "title", 0);
}

void main(){
    struct Man m1;
    m1.name = "rocy";
    m1.age = 18;
    m1.toEat = toEat;
    m1.toEat("rice");
    getchar();
}

typedef struct Man{
    char *name;
    int age;
    //函数指针
    void(*toEat)(char*);
}Man;
//Man结构体指针取别名ManP
typedef Man* ManP;
void toEat(cahr* text){
    MessageBoxA(0, text, "title", 0);
}

//改名
void rename(ManP man1){
    man1->name = "rocy";
}

void main(){
    Man m1 = {"lucy", 19, toEat};
    ManP mp = &m1;
    mp->toEat("rice");
    //传递指针,该名
    rename(gp1);
    getchar();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值