(八)C语言入门,代码编程,深入结构体【130行】【原创】

这篇博客介绍了C语言中结构体的定义与使用,包括typedef的运用,以及结构体变量的传递方式。文章通过示例展示了如何使用指针直接访问结构体成员,探讨了内存管理的概念,如栈、堆和静态区,并讲解了字符串复制函数my_strcpy的实现。此外,还涉及了const关键字在指针中的应用。
摘要由CSDN通过智能技术生成

目录

十二篇文章汇总,独家吐大血整理

编译环境

运行结果

test8.c


编译环境

编译环境:VS2019

运行结果

test8.c

#include <stdio.h>
#include <assert.h>

//struct Stu
//{
//	char name[20];
//	short age;
//	char tele[12];
//	char sex[5];
//}s1, s2, s3;

typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu2;

//struct Stu
//{
//	char name[20];
//	short age;
//	char tele[12];
//	char sex[5];
//}s2;

struct S
{
	int a;
	char c;
	char arr[20];
	double d;
};

void print1(struct S s3)
{
	printf("%d\n",s3.a);
	printf("%c\n", s3.c);
	printf("%s\n", s3.arr);
	printf("%lf\n", s3.d);
};

void print2(struct S* s3) 
{
	printf("%d\n", s3->a);
	printf("%c\n", s3->c);
	printf("%s\n", s3->arr);
	printf("%lf\n", s3->d);
};

struct T
{
	char arr[10];
	struct S s;
	char* pc;
};

void my_strcpy(char* dest, const char* src)//这个const的存在使得src的值不可更改
//防止*dest++ = *src++这一句你写反了
{
	char* dest;
	char* src;
	//while (*src != '\0')
	//{
	//	*dest = *src;
	//	dest++;
	//	src++;
	//}
	//*dest = *src;

	//while (*dest++ = *src++)//这个是优化之后的,妙妙妙,但是可读性差
	//{
	//	;
	//}

	if (dest != NULL && src != NULL)//再次优化之后的
	{
		assert(dest != NULL);//断言,会提示出错位置
		assert(src != NULL);

		while (*dest++ = *src++)//这个是优化之后的,妙妙妙,但是可读性差
		{
			;
		}
	}
}

int main()
{
	//struct Stu s1;
	Stu s2;//这两行语句都正确
	//struct Stu s1 = {"张三",22,"123456","man"};
	//Stu2 s2 = { "张三",22,"123456","man" };//error

	char arr[] = {"hehe"};
	struct T t = { "haha",{1,'c',"arr",1.23 },arr };
	//struct T t = { "haha",{},arr };
	printf("%s\n",t.arr);
 	printf("%c\n", t.s.c);
	printf("%s\n", t.s.arr);
	struct S s2 = {1,'c',"arr",2.34};
	//struct S* s3 = { 1,'c',"arr",2.34 };//error
	print1(s2);//这种首先将s2赋给s3(涉及到压栈),再从s3里面取,一来多占用空间,二来速度也慢
	print2(&s2);//这种方法直接从s2里面取,省空间,而且速度快

	//程序代码=栈+堆+静态区
	//栈=函数开辟空间,局部变量,等等
	//堆=动态分配,等等
	//静态区=静态变量,全局变量,等等
	
	//数据结构=线性数据结构+树形数据结构
	//顺序表=顾名思义
	//链表=顾名思义
	//栈=先进后出=压栈出栈//出栈==删除数据
	//队列=没讲
	//以上四个是线性数据结构


	char arr2[] = { "#######" };
	char arr3[] = {"bit"};
	my_strcpy(arr2, arr3);
	printf("%s\n", arr2);

	const int num = 10;//这里num不可更改
	//int* p = &num;//如果是这一句,则p更改了nun的数值,违背规则
	const int* p = &num;//修饰*p,*p不可更改,加上const是为了不违背num的规则,使得p不可更改num的数值
	//int* const p = &num;//修饰p,p不可更改

	//*p = 20;//但是这却打印出了20,违背规则
	printf("%d\n",num);



	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值