C语言快速讲解(五)结构体与指针

前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。

----------分割线-----------

需要用的一些头文件:

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Windows.h>
----------分割线--------

1.解释:结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型,看例子:

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

void main(){
	//初始化结构体的变量
	//1.
	struct Man m1 = {"Jack",21};
	printf("m1的值%s,%d\n",m1.name,m1.age);

	//2.
	struct Man m2;
	//m2.name = "Rose";
	m2.age = 20;
	strcpy(m2.name,"Rose");
	sprintf(m2.name,"K");
	printf("m2的值%s,%d\n", m2.name, m2.age);

	//类似JavaScript字面量赋值,只能在变量声明时赋值
	struct Man m3 = m2;
	printf("m3的值%s,%d\n", m3.name, m3.age);
	getchar();
}

2.结构体的其他写法:

struct Man{
	char name[20];
	int age;
} m1, m2 = { "A", 20 };//m1结构体变量名

void main(){
	strcpy(m1.name, "B");
	m1.age = 11;
	printf("m1的值%s,%d\n", m1.name, m1.age);
	printf("m2的值%s,%d\n", m2.name, m2.age);

	getchar();
}
3.匿名结构体(控制结构体变量的个数,相当于java中的单例):
struct{
	char name[20];
	int age;
}m1;
4.结构体嵌套:
struct Teacher{
	char name[20];
};

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

void main(){
	struct Student s1 = { "A", 19, {"TT"} };
	printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);

	struct Student s2;
	s2.age = 20;
	strcpy(s2.name, "ss");
	strcpy(s2.t.name,"tt");
	printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);
	getchar();
}
5.结构体嵌套2:
struct Student{
	char name[20];
	int age;
	struct Teacher{
		char name[20];
	}t;
};

void main(){
	struct Student s1 = { "A", 19, { "TT" } };
	printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);

	struct Student s2;
	s2.age = 20;
	strcpy(s2.name, "ss");
	strcpy(s2.t.name, "tt");
	printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);
	getchar();
}
6.结构体与指针:
struct Man{
	char name[20];
	int age;
};

void main(){
	struct Man m1 = {"w",20};
	//结构体指针
	struct Man *p = &m1;
	printf("m1地址是%#x\n",p);
	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);

	getchar();
}

6_2.结构体与指针:

struct Man{
	char name[20];
	int age;
}M,*MP;

void main(){
	//给结构体的成员变量赋值
	strcpy(M.name,"A");
	M.age = 20;

	//给指针赋值
	MP = &M;

	printf("%s,%d\n",MP->name,MP->age);
	getchar();
}

7.指针与结构体数组:
struct Man{
	char name[20];
	int age;
};

void main(){
	struct Man mans[] = { {"A",1}, {"B",2}, {"C",3} };
	//遍历结构体数组
	//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(mans) / sizeof(struct Man);i++){
		printf("%s,%d\n", mans[i].name, mans[i].age);
	}
	getchar();
}
8.结构体的大小:
struct Man{
	int age;
	double weight;
};

void main(){
	//结构体变量的大小,必须是最宽基本数据类型的整数倍
	//提升读取的效率
	struct Man m1 = { 20, 20.4 };
	printf("地址:%#x\n大小:%d\n",&m1,sizeof(m1));

	getchar();
}
9.结构体与动态内存分配:
struct Man{
	char *name;
	int age;
};

void main(){
	struct Man *m_p = (struct Man*)malloc(sizeof(struct Man)*20);
	struct Man *p = m_p;

	//赋值
	p->name = "jack";
	p->age = 20;
	p++;
	p -> name = "rose";
	p->age = 11;

	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();
}
-----------分割线---------

typedef类型取别名。

优点:1.不同的名称代表在干不同的事情typedef int jint

2.不同情况下,使用不同的别名
//#if defined(__cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;

3.书写简单

例子:

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

//Age int类型的别名
typedef int Age;
//Age int类型指针的别名
typedef int* Ap;

typedef struct Man JavaBean;
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(){

	int i = 5;
	Ap p = &i;
	printf("i的地址是%#x\n",p);

	//结构体变量
	W w1 = {"Rose",20};
	//结构体指针
	WP wp1 = &w1;
	printf("w1的地址:%#x,w1的name值:%s,age的值%d\n",wp1,w1.name,w1.age);
	printf("w1的地址:%#x,w1的name值:%s,age的值%d\n", wp1, wp1->name, wp1->age);

	getchar();
}
-------------分割线------------

结构体函数指针成员

struct Girl{
	char *name;
	int age;
	//函数指针
	void(*say)(char*);
};

//girl结构体类似于Java中的类,name和age类似于属性,say类似于方法
void say(char* text){
	MessageBox(0,text,"title",0);
}

void main(){
	struct Girl g1;
	g1.name = "jack";
	g1.age = 20;
	g1.say = say;
	g1.say("你好");

	printf("%s,%d\n",g1.name,g1.age);

	getchar();
}
--------完-------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值