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; i<n-1; i++ p=(char)vArr +i* sIze, for(int j=i+ 1; j<n; j++) q=(char)VArr +j*size, if(Comp(p, q)>0) 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 < n - 1; i ++) { p = (char*)vArr + i * nSize; for(int j = i + 1; j < n; j ++) { q = (char*)vArr + j * nSize; if(Comp(p, q) > 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);