浅谈C++中指针和引用的区别

1.什么是指针

int *p = &a; //&:取地址
此时 *p = 10; // 因为p存储的是a的地址,所以p指向a,

2.什么是引用

引用是C++语言对C语言的一个重要补充,而C语言中是不包含“引用”的。

引用”; 它的作用是为变量起一个别名。引用和变量绑定在一起,对引用的操作与对其所绑定的变量或对象的操作完全等价。引用和变量是同一个地址,因此引用不分配内存地址,必须初始化,不能为空,且一旦初始化,引用的值不能改变,引用的内容可以改变。

int a = 10;
int &b = a;

b可以成为变量a的一个引用。
此时:b = 10;
&b = &a; //变量a与他的引用的地址一样 

3.引用注意事项

1) 引用不是一种独立的数据类型,对引用只能声明,不能定义。 只能先定义一个变量,然后在声明对该变量的一个引用(起个别名)。

2) 不能建立数组的引用,包括建立对数组元素的引用。

3) 不能建立引用的引用, 也没有引用的指针。

4) 可以取引用的地址。 注意此时引用的地址等于变量的地址
int a = 10;
int &b = a;
int
p = &b; // 等同于p = &a;

4.值传递和地址传递

1)C语言中可以说只有值传递。

	  func1(int a, int b);
	  func2(int *a, int *b);
  // 实际调用过程中的形式:
  {
	  int a, b;
	  ... ...
	  func1(a, b);
	  func2(&a, &b);
  }

这两个都属于值传递,只是传递的值不同而已:
第一个传递的是变量的值;
第二个传递的是变量的地址。
传递变量的值:无论函数中如何操作形参,都不会影响到实参变量的值;
传递变量的地址:无论函数中如何操作形参,会影响到实参变量的值,不会影响到实参变量的地址;
但是可以改变这个地址里的值,也就是可以改变变量的值。但是我们传递的是变量的地址,从这个角度来看是和普通的值传递完全一致的。


2)C++中引入了地址传递

  func3(int &a, int &b);
  //实际调用中的形式:
  {
      int a ,b ;
      ... ...
      func3(a ,b);
  }

这才是严格意义上的地址传递,调用函数时使用的是变量,但是传递的却是变量的地址。

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,

不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:

形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈

中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过

栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

1.指针和引用的定义和性质区别:

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。

(2)可以有const指针,但是没有const引用;

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

(7)指针和引用的自增(++)运算意义不一样;

int a=0;
int b=&a;
int *p=&a;
b++;相当于a++;b只是a的一个别名,和a一样使用.
p++;后p指向a后面的内存
(*p)++;相当于a++

指针是对内存地址的自增

引用是对值的自增

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值