⑤NDK学习之C语言结构体struct

//普通的
1
struct Person
2
{
3
    char* name;
4
    int age;
5
    void(*speek)();
6
};
//结构体可以在定义之后跟着声明或者初始化变量
1
struct Man
2
{
3
    char* name;
4
    int age;
5
    //void(*speek)();
6
}m1, m2 = {"小王",28};
//匿名结构体
1
struct 
2
{   
3
    char* name;
4
    int age;
5
}k1, k2 = {"小张",28};
//结构体的嵌套,初始化的时候{}嵌套即可,或者连.操作
1
struct Teacher
2
{
3
    char* name;
4
};
5
6
struct Student
7
{
8
    struct Teacher t;
9
    char* name;
10
};
1
struct A
2
{
3
    struct B
4
    {
5
        char* name;
6
    };
7
    char* name;
8
};
//指针函数
1
void speek() {
2
    printf("说话\n");
3
}
调用
1
void(*speek)();
//结构体与指针  *m1.  等同  m1->
1
void take() {
2
    struct Man* m1 = &m2;
3
    printf("%s,%d", (*m1).name,(*m1).age);
4
    //等价于
5
    printf("%s,%d", m1->name, m1->age);
6
}
//结构体数组
1
void structArray() {
2
    struct Person ps[] = { {"小贾",20,speek},{"小王",22,speek} };
3
    //求出结构体的数组大小
4
    int size = sizeof(ps)/sizeof(struct Person);
5
    //遍历方式一,通过指针去遍历
6
    struct Person* p = ps;
7
    for (;p<ps+size;p++) {
8
        printf("我的名字:%s,我的年龄:%d\n",p->name,p->age);
9
    }
10
    //遍历方式二,一般的数组方式去遍历
11
    int i = 0;
12
    for (;i<size;i++) {
13
        printf("我的名字:%s,我的年龄:%d\n",ps[i].name,ps[i].age);
14
    }
15
}
1
void main() {
2
    //结构体的初始化方式一
3
    struct Person p1 = {"小路",20,speek};
4
    printf("我的名字是:%s,年龄:%d\n",p1.name,p1.age);
5
    p1.speek();
6
7
    //结构体的初始化方式二
8
    struct Person p2;
9
    p2.name = "小贾";
10
    p2.age = 22;
11
    p2.speek = speek;
12
    printf("我的名字是:%s,年龄是:%d\n",p2.name,p2.age);
13
    p2.speek();
14
15
    //m1中不设置值 就会报异常 NULL
16
    //printf("------------------\n");
17
    //printf("在定义后跟着声明或者初始化变量\n");
18
    //printf("我的名字是:%s,年龄是:%d\n", m1.name, m1.age);
19
    //m1.speek();
20
21
    printf("我的名字是:%s,年龄是:%d\n", m2.name, m2.age);
22
    //m2.speek();
23
24
    printf("------------------\n");
25
    printf("匿名结构体\n");
26
    printf("我的名字是:%s,年龄是:%d\n", k2.name, k2.age);
27
    getchar();
28
}
//结构体大小
1
struct He {
2
    int age;
3
    double weight;
4
}h1 = {19,20.0};
5
6
void main() {
7
    //大小应该是16
8
    printf("%d",sizeof(h1)); 
9
    getchar();
10
}
结构体与动态内存分配
1
struct He {
2
    int age;
3
    double weight;
4
}h1 = { 19,20.0 };
5
void main() {
6
    //动态分配10个Man结构体
7
    struct He* p = (struct He*)malloc(sizeof( struct He)*10);
8
    //初始化
9
    int size = sizeof(p) / sizeof(struct He);
10
    struct He* loop = p;
11
    for (;loop<p+size;loop++) {
12
        loop->age = 20;
13
        loop->weight = 100.0;
14
    }
15
    //释放内存
16
    free(p);
17
    getchar();
18
}
//typedef 取别名,定义新的类型,方便使用
//知识点
//typedef 类型取别名
//1.不同名称代表在干不同的事情 typedef int jint
//2.不同情况下,使用不同的别名
//#if defined(_cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;
//3.书写简洁

1
//整型取别名
2
typedef int Age;
3
Age age = 10;
4
//==================================
5
//Person 结构体取别名
6
typedef struct Person P;
7
P p;
8
//Person 结构体指针取别名
9
typedef struct Person* PP;
10
PP pp = &p;
11
//==================================
12
//在结构体定义的时候取别名(对应上面两种)
13
typedef struct Model {
14
    char* name;
15
    int age;
16
    //MM1是结构体的别名,
17
    //MM2是结构体指针的别名,与变量的声明区分开(没有typedef)
18
    }MM1,*MM2;
19
//使用的时候更加简洁,更加像面向对象编程
20
MM1 mm1;
21
MM2 mm2 = &mm1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值