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_ARR
为int
,arref
为b
,arr
为a
,相当于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
,并且存在于栈区。然后开始调用被调函数func
。mp
作为func
的形参,等价于char* &tmp = mp
; 相当于给mp
取别名为tmp
。在func
函数中创建了一个新的指针变量p,用于指向新申请的malloc
内存,大小为64
个字节,并且调用memset
和strcpy
函数将堆区中的空间赋值为“小花”。最终将变量p指向重新指向为tmp
指向,即最终mp
从原来的NULL
指向了堆区中的小花,即内存地址为0x1
。
最终结果如下所示:
以上就是C++中的数组引用和指针引用的详细内容,更多关于C++数组引用和指针引用的资料请关注编程网其它相关文章!希望大家以后多多支持编程网!