C++面试题-指针-指针与指针的引用
下面代码编译运行之后是否正常运行?
void swap(char *&a, char *&b)
{ char temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
char *stra = "hello";
char *strb = "world";
swap(stra, stra);
return 0;
}
不能。在swap函数中,不能把a和b的指向的值相互交换,因为a和b都是指向的是一个不可修改的常量,不能修改常量的值。所以如果把类型改成整型的实参通过swap函数进行交换是可以实现的。
分析:
我们通常可以利用引用可以在被调函数里面进行双向传递(即改变实参的值),不过也可以通过指针同样能够达到和指针引用的效果,只不过他们之间的实现方式不一样(其实和实参和引用是一样的):指针作为形参是占有内存的,而指针引用并不占。
总结:
1. 有引用的变量,在函数里作为参数,是实参的别名,运用时,把它当作实参来使用,它的改变会影响到实参。例如:swap(&a,&b),swap(*&a,*&b)
2. 没有引用的变量或者指针变量,在函数里作为参数,是实参的引用,运用时,它只是实参传递给的数据,不可以随便修改实参的数据。swap(a,b),swap(*a,*b)
3. 是否实现函数的双向传递,还要看函数里写的是什么。
以下代码是否正确?
int a = 1;
int *&p=a;
答:错误。p作为指针引用在定义时就必须初始化,而赋值对象是指针类型的,很明显a是整型的,并不是指针。所以修改以下代码为:
int a = 1;
int *pa = &a;
int *&p=pa; // 正确