C++中的数组引用和指针引用

 更新时间:2021年09月03日 15:52:10   作者:Enoch0813  
这篇文章主要介绍了C++中的数组引用和指针引用详细的相关资料,需要的朋友可以参考下面文章内容

C++中的数组引用和指针引用

一、引用的本质

我们在讲解引用之前需要知道为什么C++中会单独提出引用这个概念,在前面也提到在C++从一定角度上是C语言的升级版,其实引用时和C语言中的指针一样的功能,并且使得语法更加简洁。既然提到和指针功能相同,那么引用的功能其实就是给空间取别名。

代码解析:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

void test01()
{
 int a = 10;
 int& b = a;
 b = 100;
 cout << a << endl;
}

void func(int& a)
{
 a = 200;
}

void test02()
{
 int a = 10;
 func(a);
 cout << "a=" << a << endl;
}

int main()
{
 test01();
 test02();
 system("pause");
 return EXIT_SUCCESS;
}

代码分析:

void test01()
{
 int a = 10;
 int& b = a;
 b = 100;
 cout << a << endl;
}

首先我们定义了一个整型变量a,并且取值为10。接下里,int& b = a;相当于是给a的空间取别名为b,类似于C语言中的指针,新定义了一个指针变量b,指向了内存空间a。这里的&不是取地址符号,在这里是引用标志。最终通过引用b修改内存空间a的值为100,并且最终进行打印。

最终结果如下图:

void func(int& a)
{
 a = 200;
}

void test02()
{
 int a = 10;
 func(a);
 cout << "a=" << a << endl;
}

test01中是直接在一个函数里进行引用的,我们在test02中换一个引用方式,将引用参数作为被调函数func的形参。最终结

果如下图:

总结:

  • 引用的本质其实是编译器在内部使用常指针来实现。例如int& b = a;其实在等价于int* const b = &a;只不过该操作是编译器内部进行的。所以其实引用创建时,必须初始化。
  • 引用一旦初始化不能改变它的指向
  • 引用必须引用一块合法的内存空间
  • &不是取地址操作符,是引用的标记作用

二、数组的引用

int main()
{
 int arr[] = { 1, 2, 3, 4, 5 };
 //第一种方法
 typedef int(MY_ARR)[5];
 MY_ARR& arref = arr;

 //第二种方法
 int(&arref2)[5] = arr;

 //第三种方法
 typedef int(&MY_ARR3)[5];
 MY_ARR3 arref3 = arr;

 for (int i = 0; i < 5; i++)
 {
  cout << arref[i] << endl;
 }
 cout << endl;//换行
 for (int i = 0; i < 5; i++)
 {
  arref2[i] = 100 + i;
  cout << arref2[i] << endl;
 }

 system("pause");
 return EXIT_SUCCESS;
}

代码分析:

首先我们定义了一个整型数组为arr,并且数组大小为5,数组元素为1,2,3,4,5
接下来我们一共有三种数组的引用方法:
第一种是定义数组类型, typedef int(MY_ARR)[5]; MY_ARR& arref = arr; 类似于MY_ARRint arrefbarra,相当于int &b=a;
第二种是直接定义引用,这种方法是最常用的。int(&arref2)[5] = arr; 相当于int &b=a;
第三种是建立引用数组类型。typedef int(&MY_ARR3)[5]; MY_ARR3 arref3 = arr;这种方法不怎么常用。

最终运行结果如下图:

三、指针的引用

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

void test01()
{
 char* p2 = (char*)"馨怡";
 char*& p1 = p2;
 cout << p1 << endl;
}
//被调函数
void func(char*& tmp)
{
 char* p;
 p = (char*)malloc(64);
 memset(p, 0, 64);
 strcpy(p, "小花");
 tmp = p;//省了*
}
//主调函数
void test02()
{
 char* mp = NULL;
 func(mp);//省了&
 cout << mp << endl;
}

int main()
{
 test01();
 test02();
 system("pause");
 return EXIT_SUCCESS;
}

分析代码:

void test01()
{
 char* p = (char*)"馨怡";
 char*& p1 = p;
 cout << p1 << endl;
}

为了让大家更清楚的了解,特意附上一张图

从图中可以看出,首先我们创建了一个char * 类型的指针变量p,指向了文字常量区馨怡所在的内存空间,即图中的0x1234,那么经过指针的调用,即重新定义了一个指针变量p1也指向了内存空间0x1234,即给p取别名p1

最终结果如下图:

//被调函数
void func(char*& tmp)
{
 char* p;
 p = (char*)malloc(64);
 memset(p, 0, 64);
 strcpy(p, "小花");
 tmp = p;//省了*
}
//主调函数
void test02()
{
 char* mp = NULL;
 func(mp);//省了&
 cout << mp << endl;
}

 为了让大家更了解,特意附上一张图

从上图可以看出,我们首先定义了一个局部指针变量mp指向了NULL,并且存在于栈区。然后开始调用被调函数funcmp作为func的形参,等价于char* &tmp = mp; 相当于给mp取别名为tmp。在func函数中创建了一个新的指针变量p,用于指向新申请的malloc内存,大小为64个字节,并且调用memsetstrcpy函数将堆区中的空间赋值为“小花”。最终将变量p指向重新指向为tmp指向,即最终mp从原来的NULL指向了堆区中的小花,即内存地址为0x1

最终结果如下所示:

以上就是C++中的数组引用和指针引用的详细内容,更多关于C++数组引用和指针引用的资料请关注脚本之家其它相关文章!希望大家以后多多支持脚本之家!

相关文章

  • 如何查看进程实际的内存占用情况详解

    如何查看进程实际的内存占用情况详解

    本篇文章是对如何查看进程实际的内存占用情况进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 总结了24个C++的大坑,你能躲过几个

    总结了24个C++的大坑,你能躲过几个

    这篇文章主要介绍了总结了24个C++的大坑,你能躲过几个,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-05-05
  • C++中new的用法及说明

    C++中new的用法及说明

    这篇文章主要介绍了C++中new的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++ 实现LRU 与 LFU 的缓存算法

    C++ 实现LRU 与 LFU 的缓存算法

    设计和实现一个LRU 缓存机制。其支持获取数据 get 和 写入数据 put,设计并实现最少访问频率(LFU)缓存的数据结构。LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间进行排序。其支持get 和 put,具体了解请看下文
    2021-09-09
  • QT中QTableWidget加载大量数据不卡顿的解决

    QT中QTableWidget加载大量数据不卡顿的解决

    本文主要介绍了QT中QTableWidget加载大量数据不卡顿的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++核心编程之内存分区详解

    C++核心编程之内存分区详解

    这篇文章主要为大家详细介绍了C++核心编程之内存分区,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C 语言结构体的使用方法

    C 语言结构体的使用方法

    这篇文章主要介绍了C 语言结构体的使用,文章介绍了结构体定义的多种类型,想具体了解的朋友请看下面文章的内容
    2021-09-09
  • VC++ 6.0 C语言实现俄罗斯方块详细教程

    VC++ 6.0 C语言实现俄罗斯方块详细教程

    这篇文章主要为大家介绍了VC++ 6.0 C语言实现俄罗斯方块详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • OpenCV图像处理之图像拼接详解

    OpenCV图像处理之图像拼接详解

    本文主要介绍了如何使用C++ OpenCV实现图像景拼接,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以了解一下
    2022-08-08
  • C++ vector类的模拟实现方法

    C++ vector类的模拟实现方法

    这篇文章主要介绍了C++ vector类的模拟实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论