本文是个人笔记,仅用于学习分享,素材来自青岛大学王卓老师的教学视频,如有侵权,请留言作删文处理。
📚 Week02_06_类C语言有关操作补充1
📚 补充01:数据元素类型说明
顺序表类型定义
typedef struct
{
ElemType data[];
int length;
}SqList;
// 顺序表类型
ElemType 代表顺序表 data[] 中数据元素类型。例如,
顺序表 data[] 中存放的是字符串,则 ElemType 可以替换成 char。
在多项式求和时,顺序表 data[] 中存放的是 float 类型的多项式系数,则 ElemType 可以替换成 float。
也可以在程序开头定义 ElemType 的类型,例如
typedef char ElemType;
typedef struct
{
ElemType data[];
int length;
}SqList;
// 顺序表类型
如果顺序表 data[] 中数据元素类型是整型,则可以有
typedef int ElemType;
typedef struct
{
ElemType data[];
int length;
}SqList;
// 顺序表类型
如果定义的顺序表 data[] 中数据元素类型是复杂类型,
例如,多项式求和中,顺序表 data[] 的数据元素不仅要存系数,还要存指数。
此时,可以将 顺序表 data[] 的数据元素类型定义成结构体类型,有
typedef int ElemType;
typedef struct
{
float p;
int e;
}Polynomial;
typedef struct
{
Polynomial *elem;
int length;
}SqList;
// 顺序表类型
📚 补充02:数组定义
数组静态分配
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
// 顺序表类型
数组动态分配
typedef struct
{
ElemType *data;
int length;
}SqList;
// 顺序表类型
数组名 data 存放的是数组的第一个元素 data[0] 的地址,也就是数组的基地址,数组的首地址。
既然数组名 data 存放的是地址,则可以直接定义一个指针变量,存放数组的首地址。
可以用动态分配函数给数组动态分配内存。
SqList L;
L.data = (ElemType *)malloc(sizeof(ElemType)*MaxSize);
📚 补充03:C 语言的内存动态分配
SqList L;
L.data = (ElemType *)malloc(sizeof(ElemType)*MaxSize);
⭐ malloc (m) 函数
开辟 m 字节长度的地址空间,并返回这段空间的首地址。
⭐ sizeof (x) 运算
计算变量 x 的长度
x 既可以是变量,也可以是变量类型,计算变量类型所占用的字节数。
如果 ElemType 的类型是 char 类型,一个数据元素占用 1 个字节;
如果 ElemType 的类型是 int 类型,一个数据元素占用 4 个字节;
例如,多项式求和中,ElemType 的类型是复杂类型,包含一个系数变量和一个指数变量。
系数变量是 float 类型,指数变量是 int 类型,一个 ElemType 数据元素占用 8 个字节。
如果 MaxSize = 100,则malloc 函数在内存中申请 8 × 100 = 800 个字节。
❓800个字节空间如何分配?是分配成 200 个小空间,还是 100 个小空间?
🔖通过数据元素的类型 (ElemType *) 告诉计算机如何分配这 800 个字节空间。
如果 ElemType 的类型是 char 类型,计算机将 800 个字节成 800 个字节空间;
如果 ElemType 的类型是 int 类型,计算机将 800 个字节成 200个字节空间;
如果 ElemType 的类型是上述负责类型,计算机将 800 个字节成 100 个字节空间;
❓ (ElemType *) 中 * 是什么意思?
🔖 括号 ( ) 表示强制类型转换运算。
(int) 表示强制转换成 int 类型,(float) 表示强制转换成 float 类型。(int * ) 表示强制转换成 指向 int 类型的指针。
(ElemType *) 表示强制转换成 ElemType 数据类型的指针。
因为数组中第一个元素首地址是 ElemType 的指针,所以需要 (ElemType *) 进行强制转换。
通过
L.data = (ElemType *)malloc(sizeof(ElemType)*MaxSize);
这种方式,就可以获得 sizeof(ElemType)*MaxSize 这么大块的基地址,即第一个元素的基地址。
有了第一个元素基地址,就可以通过指针或是数组下标获取其他元素。
⭐ free § 函数
释放指针 p 所指变量的存储空间,即彻底删除一个变量。
⭐ 需要加载头文件 <stdlib.h>
📚 补充04:C++动态存储分配
new 类型名T (初值列表)
功能:申请用于存放 T 类型对象的内存空间,并依初值列表赋以初值结果值。
成功:T 类型的指针,指向新分配的内存
失败:0(NULL)
例如:
int *p1 = new int;
new 一个 int,从内存中动态分配一个 int 型的 4 个字节的空间,
new 出来的空间,最后得到该空间的地址,并赋值给指针变量 p1。
int *p1 = new int(10);
new 一个存储空间,并将该存储空间赋以初值 10,并将分配的存储空间的地址赋值给指针变量 p1。
指针变量 p1 指向新分配的空间的地址,指针变量 p1 存放的是新分配空间的地址。
delete 指针 p
功能:释放指针 p 所指向的内存。p 必须是 new 操作的返回值。
📚 补充05:C++ 中参数传递
📌 函数调用时,传送给形参表的实参必须与形参有三个一致:
⭐ 类型一致,
⭐ 个数一致
⭐ 顺序一致。
📌 参数传递有两种方式:
⭐ 传值方式:参数为整型,实型,字符型等。
⭐ 传地址:
➔ ➔ 参数为指针变量
➔ ➔ 参数为引用类型
➔ ➔ 参数为数组名
学习笔记最后有微信公众号:惟CPP,欢迎关注,一起交流学习进步~
C语言与C++动态内存管理及参数传递解析
本文介绍了C语言中顺序表的数据结构定义,包括静态和动态数组分配,以及如何使用malloc函数动态分配内存。同时,讲解了C++中的动态存储分配,如new运算符的使用以及如何通过new初始化对象。此外,还提到了C++中的参数传递原则。文章适合学习数据结构和算法的读者,特别是关注内存管理和C/C++编程的同学。
632

被折叠的 条评论
为什么被折叠?



