15-C语言结构体

1.todo:什么是空间复杂度:
实现算法需要的额外辅助空间和问题规模之间的函数关系,与运行次数没有关系
如何计算空间复杂度:
①函数的形参不计算(因为每次执行函数都需要形参,并不是额外的辅助空间)
②常数的空间复杂度为O(1)
③递归的空间复杂度高(递归不到最后的时候,递归前面的函数不能出栈)
④并不是所有函数的空间复杂度都为(O(1)),如:筛选法求素数
2.自定义数据类型:也称为结构体
struct 类型名
{
结构体成员
};//注意分号
3.Tab键,自动补齐剩余单词
4.结构体里面也可以用结构体,结构体定义完了以后可以随意使用,它的地位和基本类型一样
5.如何访问结构体成员?
①访问结构体普通变量通过"."访问其成员
②访问结构体指针变量通过"->"访问其成员,指向符自带解引用
6.有两个符号自带解引用:[] 和 ->
7.结构体作为参数传递时,总是传递它的地址(更节约空间,传递实参也是需要时间的,实参越大,时间越长),而不传递结构体本身,因为每一个结构体都是很庞大的,字节数也是巨大的,所以实参不会传结构体而是传指针
8.typedef(type define定义类型)
定义:typedef 旧类型名 新类型名
应用:
①将复杂的类型起一个简短的别名
②将已有的类型起一个和问题相关的名字,例如size_t,time_t(工作中常用)
9.两种形式等同
struct A
{
	int a;
	char b;
};
typedef struct A A;
//等同于
typedef struct A
{
	int a;
	char b;
}A;
10.通过typedef给一个很长的类型名起一个别名
uint64:u代表unsigned,int是整型,64代表64个位,也就是8个字节
//typedef 旧类型名 新类型名;
typedef unsigned long long int uint64;//u代表unsigned,int是整型,
//64代表64个位,也就是8个字节

int main()
{
	unsigned long long int a = 10;
	uint64 b = 20;//别名
	printf("%d\n",b);
	return 0;
}
11.通过Show输出Student数组arr的所有内容
注意:数组arr每一个下标代表一个大格子,一个大格子不一定只有一个数据
struct Student//自定义学生结构体
{
	char name[20];
	int age;
};

//通过Show输出Student数组arr的所有内容
void Show(const struct Student *p,int len)
{
	for(int i = 0;i<len;i++)
	{
		printf("%s,%d\n",p[i].name,p[i].age);
		//printf("%s,%d\n",p->name,p->age);
		//p++;
	}
}

int main()
{
	struct Student arr[3] = {"刘备",28,"曹操",26,"孙权",20};
	//把刘备的age改为30
	arr[0].age = 30;//下标0这个格子的age修改为30
	printf("%d\n",arr[0].age);
	//通过指针将age改为35
	struct Student *ps = &arr[0];
	ps->age = 35;
	printf("%d\n",arr[0].age);
	Show(arr,sizeof(arr)/sizeof(arr[0]));

	return 0;
}
12.哪一种形式传参更好
结论:传结构体地址更好一些,因为传递实参也是需要时间的,实参越大,需要的时间越长,传一个int地址只需要4个字节,而传一个结构体则需要很长的时间
struct Student//自定义学生结构体
{
	char name[20];
	int age;
};

void Show(struct Student stu)//设计不好,结构体是很庞大的,字节数也是巨大的,所以实参不会传结构体而是传指针
{//结构体普通变量通过.访问其成员
	printf("%s,%d",stu.name,stu.age);
}

void Show(const struct Student *ps)//更好一些,因为传递实参也是需要时间的,传一个int地址只需要4个字节
{//结构体指针变量通过->访问其成员
	printf("%s,%d",ps->name,ps->age);
}

int main()
{
	struct Student stu1 = {"liebei",28};

	return 0;
}
13.通过变量访问其结构体成员
struct A
{
	int a;
	int *b;
};

struct B
{
	float c;
	struct A d;
};

int main()
{
	struct B bb;
	struct B *pb;
	//要用什么符号只与"我"有关
	//通过bb访问其成员a,b,c    bb是一个变量,要用.访问
	bb.d.a;
	bb.d.b;
	bb.c;
	//通过pb访问其成员a,b,c   pb是一个指针,要用->访问
	pb->d.a;
	pb->d.b;
	pb->c;
	return 0;
}
14.
注意:①字符串不能直接赋值,需要使用字符串拷贝函数
②定义结构体只有在执行完最后的";"以后才算定义完
struct Student//自定义学生结构体
{
	char name[20];
	int age;
};//定义完成后,其作用和基本类型完全一致

struct B
{
	//struct B f;//error 因为在下一行才定义完成
	struct B *g;//ok  自己包含自己的指针是可以的
};//执行到这里才定义完成

int main()
{
	//如何使用结构体
	struct Student stu1;
	struct Student stu2 = {"liubei",30};

	//1.将stu2的age改为28岁,如何做?
	stu2.age = 28;
	//输入stu2的信息
	printf("%s,%d\n",stu2.name,stu2.age);
	//2.把stu1改为曹操,25岁,如何做?
	//stu1.name = "caocao";//字符串不能赋值,error,重点
	strcpy(stu1.name,"caocao");
	stu1.age = 25;
	//输出stu1的信息
	printf("%s,%d\n",stu1.name,stu1.age);

	struct Student *ps = &stu1;
	//通过ps将其age修改为26
	//(*ps).age = 26;//结构体成员运算符.的优先级大于指针*的优先级
	ps->age = 26;//ok,常用,->自带解引用
	printf("%d\n",(*ps).age);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值