//普通的
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;