温馨提示
写博客是为了记录在开发过程中所涉及到的技术以及遇到的问题的解决,如果该博客对您有所帮助,希望可以点个关注/喜欢;如果您对文章中的内容有什么不同的见解,欢迎留言进行讨论。谢谢!
(四)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();
}