指针和引用的区别

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的地址是一样的,*p被赋值成了20,而*p就是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被改变了。因为传的是引用,引用就是所引用变量的一个别名。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值