C++学习——引用与指针

引用(reference)为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明写成&d的形式来定义引用类型,其中d是声明的变量名。

定义独立引用时需要注意以下规则:

  • 引用型变量在定义时必须初始化。
  • 被引用的对象必须已经分配了空间,即不能为空,或空指针。
  • 被引用的对象不能为地址,即指针变量、数组变量等不能被引用。

引用定义举例:

#include <iostream>

using namespace std;
#include "FouYinyong.h"


int main(int argc, const char * argv[])
{
    int a ;
    int &b = a; //&在这里,b引用了a
    
    b = 1024; //实际也是给a赋值
    
    cout<< a << endl;
    bool isEqule = &a == &b; //比较他们俩的地址
    cout<<  isEqule << endl;
    
    cout << "a与b的地址"<<endl;
    cout <<&a<<"|||"<<&b<<endl;
    
    
    return 0;
    
    /*-------▼下面代码有错,注释后才能运行▼-----------
     int x[] = {12,15,20} ;
     int &y = x;    //错误:数组、指针不能被引用
     int x1;
     int &y1;    //错误:引用时必须初始化
     y1 = x1;
     -------▲上面代码有错,注释后才能运行▲-----------*/
    
}

输出结果:

1024
1
a与b的地址
0x7fff5fbff88c|||0x7fff5fbff88c


引用作为参数的例子

#include "FouYinyong.h"
#include <iostream>

using namespace::std;

FouYinyong::FouYinyong(){
    
}

void FouYinyong::swap(int &x ,int &y){          //FouYinyong::swap(int *x,int *y){
    
    cout << "x>>>>"<<x <<"|||y>>>"<<y<<endl;
    int temp;                                   //    int temp
    temp = x;                                   //    temp = *x;
    x = y;                                      //    *x = *y;
    y = temp;                                   //    *y =temp;
    cout << "x>>>>"<<x <<"|||y>>>"<<y<<endl;
}                                               //}


void FouYinyong::doSwap(){
    int x = 12;
    int y = 33;
    int &a = x;
    int &b = y;
    swap(a, b);
}

上面的代码右边注释部分是指针。

引用并非对象,相反的,它只是为了一个已经存在的对象所起的另外一个名字。所以在使用引用的时候,不需要加上&号,只是在定义的时候加上&号。

不过我还是不太明白引用在哪些情况下需要用到,如果懂的朋友,请指点一下。

错误的引用用法

int &a = 10;    //错误,引用类型的初始值必需是一个已分配地址空间的对象
double dval = 3.14;
int &reval = dval ;    // 错误:此处引用类型必须是int类型



指针(pointer)是指向(point to )另外一种 类型的复合类型(引用也是复合类型),与引用类似,指针也实现了对其他对象的间接访问。

#include <iostream>
using namespace std;
//有两个与指针变量有关的运算符:
// &取地址运算符。
// *指针运算符(或称间接访问运算符)。
int main() {
	cout << "C++指针学习" << endl;
	int a;
	a = 110;
	int *p ;  //int *p = &a;   *p被初始化,并存有i的地址
	p = &a ;// *p的地址(p)改变为&a,改变了指针所指向的对象
	*p = 98765;  //*p的值改变了,改变了指针所指向对象的值
	cout <<"p指针::" << *p <<endl;
	cout <<"a::" << a <<endl;
	cout <<"p指针指向的地址::" << p <<endl;
	cout <<"p指针指向的地址::" << &*p <<endl;
	cout <<"a的地址::"<<&a<<endl;
	return 0;
}


如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?“&”和“*”两个运算符的优先级别相同,但按自右至左方向结合,因此先进行*pointer_1的运算,它就是变量a,再执行&运算。因此,&*pointer_1与&a相同,即变量a的地址。


引用与指针的区分

int i = 10;
int &r = i;     //&紧随类型名出现,因此是声明的一部分,r是一个引用。(引用使用之时不需要带&)
int *p;         //*紧随类型名出现,因此是声明的一部分,p是一个指针
p = &i;         //&出现在表达式中,是一个取地址符。改变了p的地址,即改变了p指向的对象
*p = i;           //*出现在表达式中,是一个解引用符
int &r2 = *p     //&是声明的一部分,所以是r2是一个引用

主要是区别好"&"在声明的时候是作为引用来用,其他情况都是解地址符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值