C语言基础知识总结(二)

C语言之结构体:

C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型。

1、其一般定义方式为:

//定义
struct Man{
	//成员
	char name[20];
	//char *name;
	int age;
	//int(*func)();
};

//使用
void main(){
	//初始化结构体的变量
	//struct  Man m1 = { "Jack", 20 };

	struct  Man m1;
	//m1.age = 20;
	//m1.name = "ooo";//不能这么赋值

	m1.age = 88;
	strcpy(m1.name, "hh");
	sprintf(m1.name, "d44");

	struct Man m2 = m1;

	printf("%s,%d\n", m1.name, m1.age);
	printf("%s,%d\n", m2.name, m2.age);
	getchar();
}

2、还可以给他指定变量名:

//定义
struct Man{
	//成员
	char name[20];
	//char *name;
	int age;
	//int(*func)();
} m3, m4 = {"ddd",99};//结构体变量名

//使用
void main(){
	m3.age = 88;
	strcpy(m3.name, "hh");
	//sprintf(m3.name, "d44");

	printf("%s,%d\n", m3.name, m3.age);
	printf("%s,%d\n", m4.name, m4.age);
	getchar();
}

3、当然我们平时经常见到的还有一种匿名结构体,相当于Java中的单例模式:

struct{
	char name[20];
	int age;
} m1;//变量

void main(){
	m1.age = 30;
	strcpy(m1.name, "www");
	printf("%s,%d\n", m1.name, m1.age);
	getchar();
}

这种声明的好处就是:控制结构体变量的个数。

4、结构体之间的嵌套

1、
struct Teacher
{
	char name[20];
};

struct Student
{
	char name[20];
	struct Teacher t;
};

void main(){
	//struct Student s1 = { "xiaoming", {"xiaohua"} };
	struct Student s1;
	strcpy(s1.t.name, "sss");
	getchar();
}

2、
struct Student
{
	char name[20];
	struct Teacher {
		char name[20];
	} t;
};

void main(){
	struct Student s1;
	strcpy(s1.t.name, "sss");

	printf("%s\n", s1.t.name);
	printf("%#x\n", &s1.t.name);
	getchar();
}

5、结构体指针

struct Man{
	char name[20];
	int age;
};

void main(){
	struct Man m1 = { "Jack", 0 };
	//结构体指针
	struct Man *p = &m1;
	printf("%s,%d\n", m1.name, m1.age);
	printf("%s,%d\n", (*p).name, (*p).age);
	//"->"(箭头)是(*p).简写形式
	printf("%s,%d\n", p->name, p->age);
	//(*env)->

	getchar();
}

我们可以发现我们最最常用的“p->name”形式 p就代表指针。

6、指针与结构体数组

struct Man{
	char name[20];
	int age;
};

void main(){
	struct Man mans[] = { { "Jack", 20 }, { "Rose", 19 } };

	//遍历数组
	struct Man *p = mans;
	for (; p < mans + 2;p++){
		printf("%s,%d\n", p->name, p->age);
	}

	int i = 0;
	printf("%d\n", sizeof(mans));
	printf("%d\n", sizeof(struct Man));
	for (; i < sizeof(mans) / sizeof(struct Man); i++){
		printf("%s,%d\n", mans[i].name, mans[i].age);
	}

	getchar();
}

7、结构体的大小(字节对齐)

struct Man{
	double weight;//8
	int age;//4
};

void main(){
	//结构体变量的大小,必须是最宽基本数据类型的整数倍
	struct Man m1 = { 88.8, 20 };
	printf("%#x,%d\n", &m1, sizeof(m1));//16

	getchar();
}

8、结构体动态分配内存

struct Man{
	char *name;
	int age;
};

void main(){
	struct Man *m_p = (struct Man*)malloc(sizeof(struct Man) * 10);
	struct Man *p = m_p;
	//赋值
	p->name = "Jack";
	p->age = 20;
	p++;
	p->name = "Rose";
	p->age = 20;
	struct Man *loop_p = m_p;
	for (; loop_p < m_p + 2; loop_p++){
		printf("%s,%d\n", loop_p->name, loop_p->age);
	}

	free(m_p);
	getchar();
}

动态内存切记手动关闭free(m_p);

9、关键字:typedef (类型取别名)

主要作用:

//1、不同的名称代表在干不同的事情
//2、不同情况下,使用不同的别名
//3、书写简洁

 

struct Man{
	char name[20];
	int age;
};

//int类型的别名
typedef int age;
//int类型指针的别名
typedef int* ag;
typedef struct Man JMan;
typedef struct Man* JM;

//结构体取别名
//简写
typedef struct Woman{
	char name[20];
	int age;
}W, *WP;//W是Woman结构体的别名,WP是Woman结构体指针的别名

//跟上面简写一个作用
//typedef struct Woman W;
//typedef struct Woman WP;

void main(){
	age i = 10;
	ag g = &i;

	W w = { "Rose", 20 };
	WP wp = &w;

	printf("%s,%d\n", wp->name, wp->age);

	getchar();
}

这里我们要区别的一点就是typedef +结构体+变量 与 结构体+变量 的区别,第一个变量是结构体的别名,第二是结构的变量名称。

10、结构体函数指针成员

1、
struct Girl{
	char *name;
	int age;
	void(*sayHi)(char*);
};

void sayHi(char *text){
	MessageBoxA(0, text, "title", 0);
}

void main(){
	struct Girl gl;
	gl.name = "lihua";
	gl.age = 20;
	gl.sayHi = sayHi;
	gl.sayHi("hello");
	getchar();
}

2、
typedef struct Girl{
	char *name;
	int age;
	//函数指针
	void(*sayHi)(char*);
}Girl;

//Girl结构体指针取别名GirlP
typedef Girl* GirlP;

void sayHi(char* text){
	MessageBoxA(0, text, "title", 0);
}

//改名
char* rename1(GirlP gp1){
	gp1->name = "Lily";
	return gp1->name;
}

void main(){
	Girl g1 = { "Lucy", 18, sayHi };
	GirlP gp1 = &g1;
	gp1->sayHi("Byebye!");
	//传递指针,改名
	char* n = rename1(gp1);
	printf("%s", n);
	getchar();
}

我们在方法间传递结构体对象时,要传其指针变量,以保证其地址的统一。

对于结构体暂时做了以上总结,有欠缺的以后再做补充。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值