引用和指针

Posted 坠金

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用和指针相关的知识,希望对你有一定的参考价值。

总结

引用:

因为引用是变量的别名,所以引用必须初始化

因为引用不存在自己的地址,所以指针不能指向引用,即不能定义引用的指针

因为引用不是对象,但是引用又要绑定一个对象,所以不能定义引用的引用

int &(&c)=a; //报错

int& ref = value;
int& ref_ref = ref; // 不报错 因为ref本质是数字

	cout << &ref << endl; //0000000EADFBFC34
	cout << ref << endl; //42

因为操作引用就是操作变量或者对象本身,所以对于内置类型,变量和其引用之间的类型要适配

因为引用必须和变量进行绑定,所以非const引用不能绑定字面值

指针:

定义一个指针可以不用初始化(实际上这个指针变量中已经有一个值),但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置,否则会导致野指针

因为指针是一个对象,所以可以定义指针的指针

//指针的指针: 指一个指针存储了另一个指针的地址,例如:
int value = 42;
int *ptr = &value;
int **ptr_ptr = &ptr; // 定义指向指针的指针


	cout << ptr << endl;      //000000F2B4DEFA64
	cout << *ptr << endl;     //42
	cout << ptr_ptr << endl;  //000000F2B4DEFA88
	cout << *ptr_ptr << endl; //000000F2B4DEFA64
	cout << **ptr_ptr;        //42
// 通过*ptr_ptr获取ptr指向的地址,再通过**ptr_ptr获取value的值。

因为指针是对象,引用不是,所以可以定义指针的引用

指针所指向的数据的类型要和指针的类型一致

概念

符号

"&" 取地址运算符

”*“ 访问指针的内存数据

引用

1.引用就是对象或变量的别名,但引用不是对象或变量

int a=10; int &b=a;

这里面,b就是变量a的另一个名字,对b操作就是对a操作,对a操作,b也会变化

引用不初始化会报错

int a=10;
int &b;

 指针

1.指针就是变量的地址,可以通过引用访问变量,也可以通过指针访问变量,但是指针是对象,而引用不是,这是二者的根本区别

REF:

(31条消息) C++知识点2——指针、引用基础_如何定义一个引用型指针_Master Cui的博客-CSDN博客

为什么指针声明必须初始化 - 知乎 (zhihu.com)

C++指针和引用的区别

1.指针与引用区别

  • 指针是一块内存的地址值,访问变量是间接访问,引用是一块内存的别名,访问变量是直接访问.
  • 引用是一个变量的别名,本身不单独分配自己内存空间,而指针有自己的内存空间.
  • 引用使用时无须解引用(*),指针需要解引用.
  • 引用只能在定义时被初始化一次,之后不可变;指针可变.
  • 引用不能为空,指针可以为空.
  • “sizeof 引用”得到的是所引用的变量(对象)的大小,而”sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小.
  • 指针和引用的自增(++)运算意义不一样.
  • 引用是类型安全的,而指针不是(引用比指针多了类型检查)

2.指针与引用联系

引用的主要功能是传递函数的参数和返回值,c++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递、引用传递。

2.1引用的三种用法

(1)独立引用

#include<iostream>

using namespace std;



int main()

    int a=3;
    int& b=a;//b与a绑定在一起,同生共死
    cout<<b<<" "<<a<<endl;
    b=5;
    cout<<b<<" "<<a<<endl;
    return 0;

(2)作为函数参数

#include<iostream>

using namespace std;

void f(int& b)//b在这里与实参a无异

    b++;


int main()

    int a=3;
    f(a);//a受函数体内部影响
    cout<<a<<endl;
    return 0;

(3)作为函数返回

#include<iostream>

using namespace std;

int& f(int* p)

    (*p)++;
    return *p;


int main()

    int a=3,b;
    b=f(&a)*5;
    f(&a)+=10;
    cout<<b<<" "<<a<<endl;//输出20与15
    return 0;

//f函数返回一个(*p)的引用,即a的引用。此引用可作为左值进行运算。

2.1指针、引用、值传递的三种

(1)”值传递”,由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响,所以n的值仍然是0

 void Func1(int x)

x = x + 10;

int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0

(2)”指针传递”,由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10. 

 void Func2(int *x)

(* x) = (* x) + 10;

&#8943;
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10

(3)”引用传递”,由于Func3 函数体内的x 是外部变量n 的引用,x和n 是同一个东西,改变x 等于改变n,所以n 的值成为10. 

 void Func3(int &x)

x = x + 10;

&#8943;
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10

看第二个例子和第三个例子:实际是哪个”引用”可以做的任何事情”指针都可以做”,那么为什么还要”引用”呢?
答案:用恰当的工具做恰如其分的工作.
指针能够毫无约束的操作内存中的东西,尽管指针功能强大,但是非常危险,
就像一把刀,既可以砍树,裁纸,理发,只是用一把砍树的刀用来理发有点危险而且.

3.什么情况下,不能使用引用,只能使用指针呢?

一般,在使用引用能解决问题的前提下,坚决不使用指针.
在以下情况下,你应该使用指针

  • 你考虑到存在不指向任何对象的可能(在这种情况下,你您能够设置指针为空).
  • 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。

以上是关于引用和指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言指针/引用/取值

C语言的数据类型——指针

C语言的数据类型——指针

C语言之指针学习

C语言指针的内存分配和Java中的引用

求c语言指针方式引用二维数组问题