1.引用:
(1)定义一个引用是要开辟内存的,占4个字节,存放的是他引用的变量的地址(但引用是一个自动的指针,编译器会在底层自动对其进行解引用)
测试如下:
int main()
{
int a=10;
int *p=&a;
int &b=a;
cout<<&a<<endl;
cout<<&p<<endl;
cout<<&b<<endl;
*p=20;
cout<<"a="<<a<<" "<<"b="<<b<<" "<<"*p="<<*p<<endl;
}
由上可知:a和b 的地址是一样的,*p被赋值成了20,而*p就是a,所以a 就是20,而引用就相当于起了一个别名,所以b也是20。
(2)定义一个引用变量必须得初始化,不然汇编代码无法生成。
(3)引用一经引用,不能改变。
(4)汇编上,编译器不区分指针和引用。
2指针和引用的区别:
(1)指针是一个变量,这个变量存储的是一个地址,指向内存的一个存储单元;而引用相当于一个所引用的变量一个别名,此时两个变量占用的是同一个内存空间。
(2)可以有const指针,不能有const引用。
(3)指针可以有很多级,但是引用只能有1级。
eg: int **p;//合法
int &&p;//不合法
(4)指针可以为NULL,但是引用不行。而且定义一个引用变量必须初始化。
(5)指针在初始化后仍然可以改变,但是引用一经引用,不能改变。
(6)“sizeof引用”所得到的是所引用的变量(对象)的大小,而”sizeof指针”所得到的是指针本身的大小。
测试如下:
int main()
{
char a='b';
char &b=a;
char *c=&a;
cout<<"sizeof(b) = "<<sizeof(b)<<endl;
cout<<"sizeof(c) = "<<sizeof(c)<<endl;
return 0;
}
(7)指针和引用的自增运算符(++)意义不一样。
测试代码如下:
int main()
{
int a=10;
int &b=a;
int *p=&a;
b++;
cout<<"b++后a = "<<a<<endl;
a=10;
p++;
cout<<"p++后a = "<<a<<endl;
}
运行结果:
改变代码如下:
int main()
{
int a=10;
int &b=a;
int *p=&a;
b++;
cout<<"b++后a = "<<a<<endl;
a=10;
(*p)++;
cout<<"(*p)++后a = "<<a<<endl;
}
运行代码:
结果分析:
b相当于就是a的一个别名,所以b++相当于就是a++:
而p++是指向a后面的内存,而不是a了。
只有(*p)++才相当于a++;
(8)只能定义引用去指向指针,不能定义指针去指向引用。
3.指针作为参数传递:
(1)一个简单的交换函数:
void Swap(int *a,int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a=10;
int b=20;
cout<<"---交换前---"<<endl;
cout<<"a = "<<a<<","<<"b = "<<b<<endl;
Swap(&a,&b);
cout<<"---交换后---"<<endl;
cout<<"a = "<<a<<","<<"b = "<<b<<endl;
return 0;
}
运行结果:
交换成功。
(2)再看一个例子:
void test(int *p)
{
int a=10;
p=&a;
cout<<"p = "<<p<<endl;
}
int main()
{
int *p=NULL;
test(p);
if(p == NULL)
{
cout<<"p == NULL !"<<endl;
}
return 0;
}
运行结果:
此时就发生了错误,我们明明传的是指针,可是一旦出了test()函数,就无效了。
原因是:此时你的指针作为一个值传递的,所以test()函数并不能改变主函数里的指针的指向。
修改:
void test(int **p)
{
int a=10;
*p=&a;
cout<<"*p = "<<*p<<endl;
}
int main()
{
int *p=NULL;
test(&p);
if(p == NULL)
{
cout<<"p == NULL !"<<endl;
}
return 0;
}
运行结果:
我们应该传二级指针,此时主函数里p指针的指向才改变了。
4.引用作为参数传递:
(1)简单的程序:
void Swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=20;
cout<<"---交换前---"<<endl;
cout<<"a = "<<a<<","<<"b = "<<b<<endl;
Swap(a,b);
cout<<"---交换后---"<<endl;
cout<<"a = "<<a<<","<<"b = "<<b<<endl;
return 0;
}
运行结果:
交换成功!
(2)再看一个例子:
void test(int *&p)
{
int a=10;
p=&a;
cout<<"p = "<<p<<endl;
}
int main()
{
int *p=NULL;
test(p);
if(p == NULL)
{
cout<<"p == NULL !"<<endl;
}
return 0;
}
运行结果:
此时p被改变了。因为传的是引用,引用就是所引用变量的一个别名。