结构体
- 结构体是一种构造数据类型
- 把不同的数据类型整合起来成为一个自定义的数据类型
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Windows.h>
struct People{
//成员
char name[20];
int age;
}
void main(){
//初始化结构体的变量
//1.
struct People p = {"flower", 18};
//2.
struct People p1;
p1.name = "flower";
p1.age = 18;
strcpy(p1.name, "rose");
sprintf(m1.name, "lisa");
//类似JavaScript字面量赋值,只能在变量声明时赋值
struct People p2 = p1;
printf("%s, %d\n", p1.name, p1.age);
getchar();
}
结构体的几种写法
struct People{
char name[20];
int age;
}p1, p2 = {"morning", 20};//p1结构体变量名
void main(){
strcpy(p1.name, "rose");
p1.age = 10;
printf("%s, %d\n", p2.name, p2.age);
getchar();
}
匿名结构体
控制结构体变量的个数,相当于单例
struct{
char name[20];
int age;
}p1;
结构体嵌套
a
struct People{
char name[20];
}
struct Man{
char name[20];
int age;
struct People p;
}
void main(){
//字面量的方式
struct Man m = {"man", 10, {"people"}};
struct Man m1;
m1.age = 15;
strcpy(m1.p.name, "rose");
system("pause");
}
b
struct Man{
char name[20];
int age;
struct People{
char name[20];
} p;
}
void main(){
struct Man m;
strcpy(m.p.name, "rose");
//struct People p;
system("pause");
}
结构体与指针
struct Man{
char name[20],
int age;
};
void main(){
struct Man m = {"jason", 18};
//结构体指针
struct Man *p = &m;
printf("%s, %d\n", m.name, m.age);
printf("%s, %d\n", (*p).name, (*p).age);
//"->"是"(*p)."的简写形式
printf("%s, %d\n", p->name, p->age);
//(*env) ->
system("pause");
}
指针与结构体数组
struct Man{
char name[20];
int age;
};
void main(){
struct Man mans[] = {{"one", 10}, {"two", 20}};
//遍历结构体数组
//1.
struct Man *p = mans;
for(; p < mans + 2; p++){
printf("%s, %d\n", p->name, p->age);
}
//2.
int i = 0;
for(; i <sizeof(mas)/sizeof(struct Man); i++){
printf("%s, %d\n", mans[i].name, mans[i].age);
}
//(*env)->
system("pause");
}
结构体大小(字节对齐)
struct Man{
int age;
double weight;
};
void main(){
//结构体变量的大小,必须是最基本数据类型的整数倍
//提升读取的效率
struct Man m1 = {20, 10.0};
printf("%#x, %d\n", &m1, sizeof(m1));
getchar();
}
结构体与动态内存分配
struct Man{
char *name;
int age;
}
void mian(){
struct Man *m = (struct Man*)malloc(sizeof(struct Man) * 10);
struct Man *p = m;
//赋值
p->name = "rose";
p->age = 10;
p++;
p->name = "lufei";
p->age = 20;
struct Man *loop_p = m;
for(;loop_p < m + 2; loop_p++){
printf("%s, %d\n", loop_p->name, loop_p->age);
}
free(m);
getchar();
}
typedef 类型取别名
1.不同名称代表在干不同的事情typedef int jint;
2.不同情况下,使用不同的别名
#if defined(__cplusplus)
#typedef _JNIEnv JNIEvn;
#typedef _JavaVM JavaVM;
//3.书写简洁
struct Man{
char name[20];
int age;
};
//Age int类型的别名
typedef int Age;
//Age int 类型指针的别名
typedef int* Ap;
typedef struct Man JavaMan;
typedef struct struct Man* JM;
//结构体取别名
typedef struct Woman W;
typedef struct Woman* WP;
//简写
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", 10};
//结构体指针
WP wp1 = &w1;
printf("%s, %d\n", w1.name, w1.age);
printf("%s, %d\n", wp1->name, wp1->age);
getchar();
}
结构体函数指针成员
struct Man{
char *name;
int age;
//函数指针
void(*toEat)(char*);
}
//Man类似于Java中的类,name和age类似于属性,toEat类似于方法
void toEat(char *text){
MessageBoxA(0, text, "title", 0);
}
void main(){
struct Man m1;
m1.name = "rocy";
m1.age = 18;
m1.toEat = toEat;
m1.toEat("rice");
getchar();
}
typedef struct Man{
char *name;
int age;
//函数指针
void(*toEat)(char*);
}Man;
//Man结构体指针取别名ManP
typedef Man* ManP;
void toEat(cahr* text){
MessageBoxA(0, text, "title", 0);
}
//改名
void rename(ManP man1){
man1->name = "rocy";
}
void main(){
Man m1 = {"lucy", 19, toEat};
ManP mp = &m1;
mp->toEat("rice");
//传递指针,该名
rename(gp1);
getchar();
}