(四)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();
}
网友评论