c++学习笔记(2.c++中的引用)(二)
1.c++中为什么不允许定义引用数组,Type& name[num]: 引用数组理论上是一个数组,每一个元素都是一个引用。但是数组是一段连续内存空间,所有说这些引用的地址也应该是连续的。但是引用的地址也就是变量的地址,所以说引用数组是没有意义的,直接用原来的变量数组就可以了。换个角度再说,如果引用数组成了,那想访问这个数组,对引用取地址&&name,不就产生二义性了吗!所以c++里面没有引用数组。
2.如何定义一个数组的引用:其实数组的引用,就是一个数组元素类型的指针的引用,如:int* &d = p;
3.数组的引用与数组指针有什么区别:数组的引用,是一个数组元素类型的指针的引用。数组指针,是一个指向数组的指针。两者没有什么关系!!!
4.如何定义一个函数的引用:函数的引用,就是函数指针的引用,如:void (* &m)(void) = q;
5.函数的引用与函数的指针有什么区别:没什么区别,函数的引用就是函数指针的引用,两者是一个东西!!!
这里有一个小例子(请仔细查看备注):
[cpp]
#include
void fun(void)
{
printf("hello fun\n");
}
int main(int argc, char *argv[])
{
int a[10]={1,2,3,4,5};
int* p = a;
printf("%d\n",p[2]);
int* &d = p; //这里定义了一个数组的引用,即int*类型指针的引用
printf("%d\n",d[2]); //此时d就是p
void (*q)(void) = fun; //这里定义了一个函数指针
void (* &m)(void) = q; //这里定义了一个void (* )(void)类型的函数指针的引用
m();
//q();
int qq = 12;
int (*nl)[10] = &a;
int (*na)[10] = (int (*)[10])qq; //这里要注意这个强制类型转换的方式 (int (*)[10])为一个整体类型
//要注意给引用初始化的时候 一定要是一个变量 而不能是一个常量 这里&a是一个常量 所以应该用常引用
int (* const &n)[10] = &a;//注意a是变量 &a是常量 也可以像上面的方式一样 用一个指针过度下
int (* &pn2)[10] = (int (* &)[10])n;//同一个原理的强制类型转换 有const与没有const 完全是两个类型
int (* &pn)[10] = nl; //这里定义了一个int(* )[10]类型的数组指针的引用
int (* &pn1)[10] = pn; //因为 pn就是nl
printf("%d\n",**n);
//printf("%d\n",**pn);
printf("Press enter to continue ...");
getchar();
return 0;
}
对于这段代码,有几个要注意的问题:
1.int (*na)[10] = (int (*)[10])qq; //这里要注意这个强制类型转换的方式 (int (*)[10])为一个整体类型
2.c++是严格检查数据类型的,有const与无const完全是不同的两个类型
3.int (* const &n)[10] = &a; //要注意,给引用初始化的时候,一定要是一个变量而不能是一个常量,这里&a是一个常量,所以应该用常引用 。
4.有数组引用(变量指针的引用 int* &a = b;),有函数引用(函数指针的引用 void (* &m)(void) = q;),有数组指针的引用(int (* &pn)[10] = nl;),有引用函数(一个函数的返回值是一个引用 int&fun(void)),但是切记 没有引用数组!!!