元素类型说明
顺序表类型定义
typedef struct{
ElemType data[];
int length;
} SqList;//顺序表类型
ElemType
是自定义类型,如typedef char ElemType
,typedef int ElemType
typedef struct{
float p;
int e;
}Polynomial;
typedef struct{
Polynomial *elem;
int length;
}SqList;
数组定义
数组静态分配
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;//顺序表类型
数组的空间大小是确定的
数组动态分配
typedef struct{
ElemType *data;
int length;
}SqList;//顺序表类型
// 动态分配内存
SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize)
C语言的内存动态分配
SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize)
内存分配函数,需要加载头文件<stdlib.h>
malloc(m)
:开辟m字节长度的地址空间,并返回这段空间的首地址sizeof(x)
:计算变量x的长度free(p)
:释放指针p所值变量的存储空间,即彻底删除一个变量(ElemType*)
决定了开辟的地址空间被划分为多少块
C++的动态存储分配
new 类型名T(初值列表)
功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值
结果值:
成功:T类型的指针,指向新分配的内存
失败:0(NULL)
如:
int *p1 = new int;
或int *p1 = new int(10);
delete 指针p
功能:释放指针p所指向的内存。p必须是new操作的返回值
如:delete p1;
C++中的参数传递
- 函数调用时传送给形参表的实参必须与形参三个一致(类型、个数、顺序)
- 参数传递有两种方式
- 传值方式(参数为整型、实型、字符型等)
- 传地址:参数为指针变量、引用类型、数组名
传值方式
把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变
传地址方式——指针变量作参数
-
形参变化影响实参
-
形参变化不影响实参
调用完函数m和n就被释放了,交换m和n对a和b没有任何影响
传地址方式——数组名作参数
- 传递的是数组的首地址
- 对形参数组所做的任何改变都将反映到实参数组中
注意b[]
中不能指明数组大小,因为传的是数组首地址,可以用*b
代替
调用完sub(a)
后输出为world
传地址方式——引用类型作参数
引用:用来给一个对象提供一个替代的名字
j
是一个引用类型,代表i
的一个替代名,二者是同一个东西,所以地址也是一样的
i
值改变时,j
值也跟着改变,所以会输出i=7 j=7
m
是对a
的引用,n
是对b
的引用
所以对m
的任何操作也是对a
的操作,因此交换m
和n
的值也就是交换a
和b
的值
引用类型做形参的三点说明
- 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化
- 引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好
- 指针参数虽然也能达到使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,容易产生错误且程序阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
后面较多使用引用类型作参数