64指针和动态内存分配 所谓动态内存分配,是指程序由于某些原因而在运行过程中 才可以确定内存空间的需求,从而随时向操作系统提出内存 分配的请求 动态内存分配需要用到指针和new运算符,其一般形式为: pointer- new type; 若系统成功地为请求分配了内存,则指针 pointer的值将是 系统为程序所分配之内存的首地址:否则为一空指针 当程序不再使用动态内存时(包括程序退出之前)必须将动 态内存返还给系统。释放动态内存需要用到dee运算符, 其一般形式为: delete point
6.4 指针和动态内存分配 所谓动态内存分配,是指程序由于某些原因而在运行过程中 才可以确定内存空间的需求,从而随时向操作系统提出内存 分配的请求。 动态内存分配需要用到指针和 new 运算符,其一般形式为: pointer = new type; 若系统成功地为请求分配了内存,则指针 pointer 的值将是 系统为程序所分配之内存的首地址;否则为一空指针。 当程序不再使用动态内存时(包括程序退出之前)必须将动 态内存返还给系统。释放动态内存需要用到 delete 运算符, 其一般形式为: delete point;
由于C艹+语言的变量说明非常灵活,所以为单个变量申请动 态内存的实用价值不大,通常都是为一个数组申请一块动态 内存(称为动态数组)。申请动态数组的一般形式为: pointer= new type[/[/[/.i 其中:sze为一整型表达式,各c均为整型常量。当动态数 组的维数大于1时,接受动态数组首地址的指针也应当是 个多维数组指针。例 int (p)[4] p= new int[n 4] char 3],c (*cp)2][3], cp= new char[(x+ y*k2]3: cq=new charX yI 释放动态数组时,需使用如下的一般形式: delete [p
由于 C++ 语言的变量说明非常灵活,所以为单个变量申请动 态内存的实用价值不大,通常都是为一个数组申请一块动态 内存(称为动态数组)。申请动态数组的一般形式为: pointer = new type[size][c2][c3]…; 其中:size 为一整型表达式,各 ci 均为整型常量。当动态数 组的维数大于 1 时,接受动态数组首地址的指针也应当是一 个多维数组指针。例: int (*p)[4]; p = new int[n][4]; char (*cp)[2][3], *cq; cp = new char[(x + y) * k][2][3]; cq = new char[x + y]; 释放动态数组时,需使用如下的一般形式: delete []p;
int *Create Tab(int n) nt p p= new int[n] return p: It *ip= Create Tab(20); if( I=O) ∥对动态数组ip的一些应用 delete [ip
int *CreateTab(int n) { int *p; p = new int[n]; return p; } int *ip = CreateTab(20); if(ip != 0) { // 对动态数组 ip 的一些应用 } delete []ip;
65引用 6.51引用的说明与使用 storage type &ref name <=var; 其 “&”是引用说明符(注意,它与取地址运算符和 按位与运算符同形) 般情况下,在说明一个引用的同时需要用一个与其数据类 型相同的变量对其进行初始化。这是因为引用不是变量 是用户为某一变量所起的别名(Aas)。例: int i=5 &ri= i cout < ri < endl: ∥输出5 ri+=8 cout <<i << endl ∥输出13
6.5 引用 6.5.1 引用的说明与使用 type &ref_name ; 其中:符号“&”是引用说明符(注意,它与取地址运算符和 按位与运算符同形)。 一般情况下,在说明一个引用的同时需要用一个与其数据类 型相同的变量对其进行初始化。这是因为引用不是变量,它 是用户为某一变量所起的别名(Alias)。例: int i = 5, &ri = i; cout << ri << endl; // 输出 5 ri += 8; cout << i << endl; // 输出 13
若在说明引用时没有将一个变量与之联系起来,则C++将为 该引用生成一个无名的临时变量,而引用名即为该临时变量的 名字。例: nt i=5 &ri r=1: ∥将变量ⅰ的值赋给临时变量ri ri+=8: cout <<i < endl ∥输入为5 在一个程序中,除了可以说明对一般变量的引用外,还可以说 明对指针的引用。但由于引用不是变量,所以不得说明引用的 引用。例下面的说明就是错误的: int i. &ri=i &&rri= ri
若在说明引用时没有将一个变量与之联系起来,则 C++ 将为 该引用生成一个无名的临时变量,而引用名即为该临时变量的 名字。例: int i = 5, &ri; ri = i; // 将变量 i 的值赋给临时变量 ri ri += 8; cout << i << endl; // 输入为 5 在一个程序中,除了可以说明对一般变量的引用外,还可以说 明对指针的引用。但由于引用不是变量,所以不得说明引用的 引用。例下面的说明就是错误的: int i, &ri = i, &&rri = ri;
652引用与函数 6.52.1引用作为函数的参数 C+语言引入引用主要是为在函数间传递数据提供方便。引 用参数的实参与形参的结合方式为引用调用。与地址调用相 似,引用调用可以使函数修改实参的值。例: void Swap(int &a, int &b) ∥调用SWap()函数 int t= a int x=3,y=5 a= b Swap(x, y) b=t ∥X==5,y==3
6.5.2 引用与函数 6.5.2.1 引用作为函数的参数 C++ 语言引入引用主要是为在函数间传递数据提供方便。引 用参数的实参与形参的结合方式为引用调用。与地址调用相 似,引用调用可以使函数修改实参的值。例: void Swap(int &a, int &b) { // 调用 Swap( ) 函数 int t = a; int x = 3, y = 5; a = b; Swap(x, y); b = t; // x == 5, y == 3 }
6.52.2值为引用的函数 函数返回引用最能表现出引用的本质。由于引用就是与其相 联系的变量,所以值为引用的函数返回的实际上就是一个变 量(而不再是一个值)。这样的函数可以用在任何变量可以 出现的位置(比如赋值运算符的左侧)。例如 int &Index(int a[l, int n return an] Index(iArr, 5)=8 ∥等效于iA5=8
6.5.2.2 值为引用的函数 函数返回引用最能表现出引用的本质。由于引用就是与其相 联系的变量,所以值为引用的函数返回的实际上就是一个变 量(而不再是一个值)。这样的函数可以用在任何变量可以 出现的位置(比如赋值运算符的左侧)。例如: int &Index(int a[], int n) { return a[n]; } //… Index(iArr, 5) = 8; // 等效于 iArr[5] = 8;
66void和 const指针 6.61vod指针 void指针也叫无值型指针,它可以接受任何类型指针的值。 然而,若将无值型指针赋给其它类型指针,则必须进行强制 类型转换。例: nt ip void vp vp Ip p=vp, ∥错误! ip=(int)vp;∥正确 利用无值型指针可以编写出较为通用的程序
6.6 void 和 const 指针 6.6.1 void 指针 void 指针也叫无值型指针,它可以接受任何类型指针的值。 然而,若将无值型指针赋给其它类型指针,则必须进行强制 类型转换。例: int *ip; void *vp; vp = ip; ip = vp; // 错误! ip = (int*)vp; // 正确 利用无值型指针可以编写出较为通用的程序
void SortAny (void *VArr, unsigned n, int n Size int(*Comp)(void, void")) char p, 93 for(int i=0; i0) for(int k=0; k< nSize; k ++) I char temp= p[k] pk=qk: gkk]=temp
void SortAny(void *vArr, unsigned n, int nSize, int(*Comp)(void*, void*)) { char *p, *q; for(int i = 0; i 0) for(int k = 0; k < nSize; k ++) { char temp = p[k]; p[k] = q[k]; q[k] = temp; } } } }
int Cmp Integers(void *a, void *b) return * (int )a-*(int*)b It Cmp Floats(void *a, void *b) return ((flaot*)a-*(float)b <0?-1:1); int iArr[20]={…}; float fArr[30]=[.; SortAny(iArr, 20, sizeof (int), Cmp Integers) SortAny(fArr, 30, sizeof(float), Cmp Flaots)
int Cmp_Integers(void *a, void *b) { return *(int*)a - *(int*)b; } int Cmp_Floats(void *a, void *b) { return (*(flaot*)a - *(float*)b < 0 ? -1 : 1); } int iArr[20] = {…}; float fArr[30] = {…}; SortAny(iArr, 20, sizeof(int), Cmp_Integers); SortAny(fArr, 30, sizeof(float), Cmp_Flaots);