写博客是为了记录在开发过程中所涉及到的技术以及遇到的问题的解决,如果该博客对您有所帮助,希望可以点个关注;如果您对文章中的内容有什么不同的见解,欢迎留言进行讨论。谢谢!
结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据类型
struct [结构体类型] [结构体变量名] = {[结构体内参数实例化值]
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
例如:
struct Man{
char name[20];
int age;
};
void main() {
struct Man m1 = { "Jack",20};
printf("%s,%d\n", m1.name, m1.age);
getchar();
}
例如:
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();
}
例如:
struct {
char* name;
int age;
} Woman;
void main() {
Woman.name = "Lili";
Woman.age = 19;
printf("%s,%d\n", Woman.name,Woman
.age);
getchar();
}
结构体是可以进行嵌套使用的,可以分别定义使用,或者在一个结构体中定义另一个结构体
例如:
// 老师的结构体
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();
}
例如:
// 学生的结构体
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();
}
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
//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
//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();
}