【王道数据结构笔记】顺序表的静态分配代码分析

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:数据结构
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

引言

一 代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int length;
}Sqlist;
void InitList(Sqlist & L) {
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}
int main()
{
	Sqlist L;
	InitList(L);
	for (int i= 0; i < MaxSize; i++)
		printf("data[%d] = %d\n", i, L.data[i]);
	
	
	return 0;
}

二 代码分析

以下是代码拆分后的每一个步骤及其分析:

步骤1:

#define _CRT_SECURE_NO_WARNINGS

分析:
这行代码定义了一个宏_CRT_SECURE_NO_WARNINGS,它用于在编译时禁用某些安全警告。这通常是为了避免使用如strcpysprintf等可能涉及缓冲区溢出的函数时编译器发出的警告。

步骤2:

#include <stdio.h>

分析:
这行代码包含了标准输入输出库的头文件stdio.h,以便在后续代码中使用如printf等输入输出函数。

步骤3:

#define MaxSize 10

分析:
这行代码定义了一个宏MaxSize,其值为10。这个宏用于表示顺序表的最大容量。

步骤4:

typedef struct {
	int data[MaxSize];
	int length;
}Sqlist;

分析:
这行代码定义了一个结构体类型Sqlist,其中包含一个整型数组data用于存储数据,以及一个整型变量length用于记录顺序表的当前长度。

步骤5:

void InitList(Sqlist & L) {
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;
	L.length = 0;
}

分析:
这部分代码定义了一个函数InitList,它接收一个Sqlist类型的引用L作为参数。函数内部使用for循环将顺序表L中的每个元素初始化为0,并将L的长度设置为0,即初始化一个空的顺序表。

步骤6:

int main()
{
	Sqlist L;

分析:
这是main函数的开始,其中定义了一个Sqlist类型的变量L,用于表示一个顺序表。

步骤7:

InitList(L);

分析:
这行代码调用了InitList函数,并传入L作为参数。这将初始化L,即将其数据数组中的所有元素设置为0,并将长度设置为0。

步骤8:

for (int i= 0; i < MaxSize; i++)
	printf("data[%d] = %d\n", i, L.data[i]);

分析:
这行代码使用for循环遍历顺序表L的所有元素,并使用printf函数打印每个元素的值。由于L在之前已经被初始化为全0,因此打印的结果将是每个索引位置上的值都是0。

步骤9:

return 0;
}

分析:
这是main函数的结束部分,return 0;表示程序正常结束。

总结:
这段代码定义了一个顺序表的结构体Sqlist,并实现了对其的初始化以及打印操作。在main函数中,创建了一个Sqlist类型的变量L,并调用InitList函数将其初始化。随后,通过循环打印了顺序表L中所有元素的值。

代码运行结果:

data[0] = 0
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
data[5] = 0
data[6] = 0
data[7] = 0
data[8] = 0
data[9] = 0

三 Sqlist & L的作用

在C++中,Sqlist & L 是函数参数的一种声明方式,表示L是对Sqlist类型对象的引用。下面我将详细解释Sqlist & L的作用和它在代码中的具体意义。

引用(Reference)

引用是C++中的一个重要特性,它提供了一种方式,可以使得一个变量成为另一个变量的别名。换句话说,引用和它所引用的对象共享相同的内存地址。这意味着,当你修改引用时,你实际上是在修改它所引用的对象;反之亦然

Sqlist & L 的作用

void InitList(Sqlist & L)函数中,Sqlist & L的作用主要有以下几点:

1.避免拷贝:通过传递引用而不是对象本身,可以避免在函数调用时产生对象的拷贝。对于大型对象(如结构体或类),这可以显著提高性能。

通过传递引用而不是对象本身可以避免在函数调用时产生对象的拷贝,主要基于以下几个原因:

  1. 内存布局:在C++中,对象通常存储在内存中,并且有其固定的内存地址。当你传递对象本身给函数时,实际上是将对象的完整内容(即它的所有成员变量和数据)复制一份到新的内存地址,然后将这个复制的地址传递给函数。这个过程称为按值传递(pass-by-value)。如果对象非常大,那么这种复制操作可能会消耗大量的内存和时间。
  1. 引用的本质:引用是对象的别名,它并不占用额外的内存空间来存储对象的内容,而是直接指向对象在内存中的地址。因此,当你传递引用给函数时,实际上只是传递了对象的内存地址,而不是对象本身。这样,函数内部就可以通过这个地址直接访问和操作原始对象,而不需要复制对象。
  1. 直接修改原对象:由于引用和原对象共享内存,所以通过引用可以直接修改原对象的状态。在InitList函数中,我们修改了L.data数组和L.length成员,这些修改将直接反映到传入的原对象上。

  2. 增加代码清晰度:通过引用传递对象,可以清晰地表明函数的意图是修改传入的对象,而不是创建一个新的副本

在代码中的具体意义

main函数中,我们定义了一个Sqlist类型的变量L。当我们调用InitList(L);时,我们实际上是将L的引用传递给了InitList函数。这意味着在InitList函数内部对L的任何修改都会直接反映到main函数中定义的L对象上

因此,当InitList函数执行完毕后,main函数中的L对象已经被初始化了:data数组的所有元素都被设置为0length成员被设置为0。

这些修改都是通过引用传递实现的,没有涉及到对象的拷贝。

总结

Sqlist & L在C++中表示对Sqlist类型对象的引用。通过引用传递对象可以避免不必要的拷贝,并允许直接修改原对象的状态。在InitList函数中,我们通过引用传递Sqlist对象来初始化它,确保修改能够直接反映到传入的原对象上。

总结

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

  • 47
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值