指针与引用

作者: ninedreams | 来源:发表于2019-08-28 09:45 被阅读0次

指针

指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。

引用

引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。(教科书标准)

指针与引用的区别

  • 引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化
  • 有const指针,但是没有const引用
  • 指针的值可以为空,但是引用的值不能为空,并且引用在定义的时候必须初始化
  • 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变
  • sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof pointer”得到的是指针本身的大小,在64位机器下为8字节
  • 指针可以有多级,但是引用只能是一级
  • 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏
  • 指针和引用的自增(++)运算意义不一样

函数传参

指针传参数

演示代码如下,编译g++ main.c -o main -std=c++11

#include <iostream>
#include "stdio.h"
using namespace std;
void swap(int *a, int *b) {
    int *tmp = a;
    a = b;
    b = tmp;
}
void testp(int *p) {
    int c = 5;
    p = &c;
    cout << p << " " << *p << endl;
}
int main(int argc, char** argv) {
    int a = 1, b = 2;
    swap(&a,&b);
    cout << a << " " << b << endl;

    int *p = nullptr;
    testp(p);
    if (p == nullptr)
        cout << "p is nullptr" << endl;
    else
        cout << p << " " << *p << endl;

    return 0;
}

编译运行之后的结果:


image.png

可以观察到的结果:

  1. swap函数没有交换a,b的值
  2. testp函数中指针p是地址,*p取到了变量c的值
  3. testp函数没有返回后没有改变传入的指针参数p
引用传参数
#include <iostream>
#include "stdio.h"
using namespace std;
void testp(int &p) {
    cout << &p << " " << p << endl;
    p = 5;
    cout << &p << " " << p << endl;
}
int main(int argc, char** argv) {
    int p = 1;
    cout << &p << " " << p << endl;
    testp(p);
    return 0;
}

可以看到结果:

  1. 变量P三次地址都没有改变
  2. 变量P的值在函数testp中最后一次改变了

运行如下:


image.png

引用实质

我们知道在C语言中无法使用引用传参数,引用传参数是C++的语法。那么C语言中如何实现类似的功能呢?

#include "stdio.h"
void swap(int *const a, int *const b) {
     int tmp = *a;
     *a = *b;
     *b = tmp;
}
int main(int argc, char** argv) {
    int x=10,y=20;
    swap(&x,&y);
    printf("%d %d\n", x, y);
    return 0;
}

如上代码就是C语言中的实现,同样也能实现x,y的值交换,只不过函数传的参数是int *const类型。
实际上,在引用中int &b=a这一句代码可被编译器看做int * const b=&a,加上const的作用是表明指针b的自身的值(a的地址)不能改变,而指向的值(a的值)可以改变。也就是说引用相当于指针,引用与指针在编译时的方法一样,指向的都是变量的内存地址。但是也有一些不同点如下:

  1. 在定义方式中引用储存的是值,而指针是一个变量的拷贝,存储的是地址
  2. 引用只能对已经存在的变量或对象实现引用,而指针则不需要,可以定义为空
  3. 在函数的传参中,如果传递的是一个引用,意味着这个变量或对象已经存在了;如果传递的是一个指针,则不能判断这个指针是不是有效的,是不是空的,因此在函数体 中大多数都得进行指针是否为空的判断。但是虽然引用较为安全,但是利用指针来传参效率较快
  4. 引用是直接访问变量,不用分配自己的内存空间,而指针是间接访问,需要定义,需要有自己的内存空间

所以实际开发中,使用哪种方式应该由开发者自己来定,按照开发的需求来定。

相关文章

  • C++基本问题——指针与引用的区别

    指针与引用的区别 指针可以是空指针,但是引用不能是空引用。这就导致下面一个区别。 指针可能是非法的,引用总是合法的...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • 指针与引用

    指针是一个变量,存储另外一个变量的地址,指向一个内存存储单元。引用实质上与原变量是同一东西,只是变量的一个别名。 ...

  • 引用与指针

    指针是一个实体,而引用仅是个别名; 引用使用时无需解引用(*),指针需要解引用; 引用只能在定义时被初始化一次,之...

  • 指针与引用

    指针 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。 引用 引用跟原来的变量实质上是同一...

  • 指针与引用

    引用和指针非常相似,它们都用来让一个变量提供对另一个变量的访问。 引用 需要从类型和传递两个角度分别看待引用。 从...

  • C++复合类型总结(指针)

    引用是变量的别名,指针就是变量地址的别名。 与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用又有很多不...

  • Rust for cpp devs - 智能指针

    与 cpp 类似,Rust 也有智能指针。Rust 中的智能指针与引用最大的不同是,智能指针 own 内存,而引用...

  • 指针与++以及指针与引用

    2.指针与引用的差别 第一、非空区别:在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象。因此如果...

  • 王道程序员求职宝典(十一)指针与引用,树

    指针与引用 指针声明typedef别名类型检查void*指针指向指针的指针函数指针typedef简化函数指针定义初...

网友评论

    本文标题:指针与引用

    本文链接:https://www.haomeiwen.com/subject/mqhzlctx.html