数组引用 引用数组

2,906 阅读2分钟

声明

  • 引用的数组

int& b[3];

[ ]的优先级高于&,表示b是一个数组,类型是为int [3] ,步长为3。

实际C++不支持,原因如下:

  1. 引用必须被初始化,而数组并不能被另一个数组初始化或被另一个数组赋值,其中的每一个引用,你没有办法给他一下子初始化。
  2. 引用它不支持传统意义的复制,它不占用新的空间
  3. 它没有意义,它可以用指针数组实现,完全可以代替

如下:

#include <stdio.h>
int main(){
    int i=5,j=6;
    int *a[5] = {&i, &j};
    printf("%d\n", sizeof(a[0]));
    printf("%x\n", a[0]);
    printf("%d\n", *(a[0]));a[0]; // pointer to i
    printf("%d\n", *a[1]);a[1]; // pointer to j
    return 0;
}

输出:
8
c1caa21c
5
6
  • 数组的引用

int (&p)[3];

()的优先级高于[],表示p是一个数组,元素为int * ,个数为3。

typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。 C typedef

//固定大小,很难受
#include <iostream>
#include <stdlib.h>
#include <stdint.h>
using namespace std;

void ArrRef(int (&arr)[5])
{	
	for (int i = 0; i < 5; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << "\n";
}

//使用模板通用化一些,对数组通用
template<size_t SIZE>
void ArrRefTemplete(int (&arr)[SIZE])
{	
	for (int i = 0; i < SIZE; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << "\n";
}

int main(int argc, char* argv[])
{
	const int MAX_INDEX(6);
	int aIndex[MAX_INDEX] = {1,3,4,5,6};

	//如果改了数组大小MAX_INDEX的值,两个大小对不上就会有问题
// 	ArrRef(aIndex);

	//如果改了数组大小MAX_INDEX的值,也无所谓
	ArrRefTemplete(aIndex);

// 	system("pause");
	return 0;
}

PS:

  1. 它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。size_t
  2. 不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行C++ 模板详解
  3. int a = 0; and int a(0); make no difference in the machine generated code. They are the same.int a = 0 and int a(0) differences [duplicate]

参考:

  1. [C++]关于数组的引用和引用的数组
  2. Compile and Execute C++11 Online (GNU GCC v7.1.1)