• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c++ 搞代码 4年前 (2022-01-06) 55次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了C++中的数组引用和指针引用详细的相关资料,需要的朋友可以参考下面文章内容

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

一、引用的本质

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

代码解析:

 #define _CRT_SECURE_NO_WARNINGS #include 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_WARNING<span style="color:transparent">来源gaodai#ma#com搞*代#码网</span>S #include 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++中的数组引用和指针引用的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C++中的数组引用和指针引用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址