android ndk 04 C语言 结构体_结构体指针,typedef

结构体_结构体指针,typedef

结构体定义


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
//上面的头文件 下面几个例子都要有

//结构体 关键字 struct 
//结构体是一种构造数据类型
//把不同的数据类型整合起来成为一个自定义的数据类型
struct Man{
	//成员
	char name[20];
	int age;
	//int (*func)();//也可以是函数指针
};

void main(){

	//1.初始方式第一种
	//struct Man m1 = { "name", 26 };

	//2.初始方式 第二种
	struct Man m1;
	m1.age = 26;
	//m2.name = "struct_name";//这样会报错  前面说过字符串初始化的方式 这里有两种方式 1 改变结构体的name为指针 2 使用拷贝函数
	strcpy(m1.name, "cpy_name");
	sprintf(m1.name, "sprintf_name");//这两种方式都可以 赋值
	printf("%s,%d\n", m1.name, m1.age);
	//struct 可以相互赋值
	struct Man m2 = m1;
	printf("%s,%d\n", m2.name, m2.age);
	getchar();
}

效果图

01:
image

结构体的写法

//结构体的写法
 struct Man{
		//成员
	 char name[20];
		int age;
 }m1, m2 = { "jack", 20 };


 void main(){
	 strcpy(m1.name, "m1name");
	 m1.age = 10;

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

	 getchar();
 }
 

效果图

01:
image

匿名结构体

//匿名结构体

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

结构体嵌套
//结构体嵌套 
struct teacher
{
	char name[20];
};

struct student{
	char name[20];
	int age;
	struct teacher t;
};

void main(){
	//如何进行赋值  字面量的方式
	//struct student s1 = { "jack", 21, {"name"} };
	//或者
	struct student s1;
	s1.age = 10;
	//s1.t.name = "liu";//需要使用拷贝函数 
	strcpy(s1.name, "student_name");
	strcpy(s1.t.name, "lml");
	printf("%s,%d,%s\n", s1.name, s1.age, s1.t.name);
	system("pause");
}

01:
image

还可以这样写


//还可以这样写
struct Student{
	char name[20];
	int age;
	struct Teacher{
		char name[20];
	}t;
};

void main(){
	struct Student s1;
	strcpy(s1.t.name, "lml");//和上面一样的效果
	system("pause");
}

结构体指针

结构体指针1

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

void main(){
	struct Man m1 = { "name", 30 };
	//结构体指针
	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);
	system("pause");

}

image

结构体指针2

指针与结构体数组

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

void main(){
	struct Man mans[] = { { "jack", 20 }, { "rose", 19 } };
//遍历数组 两种方式
	//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);
	}
	
	system("pause");

}

image

结构体的大小

//结构体变量的大小,必须是最宽基本数据类型的整数倍  (16/8  16/4 都能整除 )
//提升读取的效率
struct Man
{
	int age;//4字节
	double weight;//8字节

};

void main(){
	struct Man m1 = {20,89.0};
	printf("%#x,%d\n",&m1,sizeof(m1));

	getchar();
}

image

可以看到 打印出来是16个字节 怎么算出来的? age 4字节 weight 8字节 那么 16 都能整除 时间换空间 空间换时间

结构体与动态内存分配



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

void main(){
	struct Man *m_p = (struct Man*)malloc(sizeof(struct Man) * 10);
	struct Man *p = m_p;//这样赋值的话就不会改变 *m_p
	//赋值
	p->name = "jack";
	p->age = 20	;
	p++;//下一个
	p->name = "rose";
	p->age = 18;

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




运行结果

image

结构体取别名


//typedef 类型取别名
//1.不同名称代表在干不同的事情typedef int jint;  
//2.不同情况下,使用不同的别名
//#if defined(__cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;
//3.书写简洁

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

typedef struct Man JavaMan;
typedef struct Man* JM;//取别名

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

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

void main(){
	int i = 5;
	Ap p = &i;//这里AP 就是int 类型指针的别名

	//结构体变量
	W w1 = { "rose", 20 };
	//结构体指针
	Wp wp1 = &w1;
	printf("%s,%d\n", w1.name, w1.age);
	printf("%s,%d\n", wp1->name, wp1->age);

	system("pause");
}


运行结果

image

结构体函数指针成员

//结构体函数指针成员

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

//Girl结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法

void sayHi(char* text){
	MessageBoxA(0, text, "titel", 0);//弹框

}

void main(){
	struct Girl g1;
	g1.age = 19;
	g1.name = "Lucy";
	g1.sayHi = sayHi;
	sayHi("nihao");

	system("pause");
}

运行结果

image

–下面一个是上面的变种

还是结构体函数指针 增加了一个方法



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);
}

//通过传递指针改名
void MyRename(Girl* gp1, char* text){
	printf("%s,%d\n", gp1->name, gp1->age);
	gp1->name = text;
}

void main(){
	Girl g1 = { "Lucy", 18, sayHi };
	printf("%s,%d\n", g1.name,g1.age);
	GirlP gp1 = &g1;

	gp1->sayHi("firstName");
	//传递指针改名 
	MyRename(gp1, "newname");
	printf("gp1 =  %s,%d\n", gp1->name, gp1->age);

	if (NULL != gp1){
		gp1 = NULL;
		free(gp1);
	}

	system("pause");
}


这里 有个坑啊 我一开始 想使用rename 这个方法 但是c里面库里面已经有这个 方法了

导致我这里一直报错 找不到原因 改成Myrename 就好了 下面放一下结果图

image

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值