引用数组意味着在保留其标识的同时对数组进行别名。对数组的引用将不是int *,而是int []。让我们通过讨论两者之间的区别来详细讨论这一点。奇怪的是, int []与int *相同,但是两者的编译器视角却完全不同。主要的两个区别如下:
- 编译器的int []是一个数组,因此它为此提供了一个迭代器(这就是为什么有For-Each循环的原因),但是int *只是一个指向整数的指针。这可能只是指向整数的指针,也可能是指向整数数组开头的指针,这完全取决于我们的观点。因此,在这种情况下,没有For-Each循环。
- 对于编译器,a和b是相同的数据类型,即int *在这里对于编译器来说,它们只是指向地址的int *。但是对于编译器,类型为as的数组为int [2]和类型b为数组的类型为int [3],它们彼此完全不同。再次只是 编译器的观点。为了更好地理解,让两个数组为int a [2],int b [3]。
执行:
- 传递数组以经典方式函数。
- 稍后,尝试在其上调用for-each循环,可以获得明显的区别。
例子:
C++
// C++ Program to demonstrate Above Approach
// Importing input output stream to take input
// and to display anything on the console
#include
using namespace std;
// Method 1
// To print array elements
void print(int arr[], size_t n)
{
// Iterating over elements on an array
// using the foreach loop
for (int element : arr) {
// Print the elements of the array
cout << element << " ";
}
// New line as all the desired elements are printed
cout << endl;
}
// Method 2
// Main driver method
int main()
{
// Declaring and initializing Integer array with
// custom input entries
int a[]{ 1, 2, 3, 4 };
size_t size = sizeof(a) / sizeof(a[0]);
// Calling the Method1 as creted above
// in the main) method to
// print array elements
print(a, size);
}
C++
// C++ Program to demonstrate Reference to an Array
// Importing input outut classes
#include
using namespace std;
// Main driver method
int main()
{
// Creating and initializing an integer array
// Custom input entries
int a[]{ 1, 2, 3, 4 };
// int (&b)[] = a;
// Declaring this way wont work as an error will be
// thrown invalid initialization of reference of type
// ‘int (&)[]’ from expression of type ‘int [4]’ Here
// you see compiler refered to "a" as int [4] not int*
int(&b)[4] = a;
// Iterating over elements using foreach loop
for (int e : b) {
// Print the elements of the array
cout << e << " ";
}
}
输出:
test.cpp: In function 'void print(int*, size_t)':
test.cpp:5:21: error: 'begin' was not declared in this scope
for(int element: arr){
输出说明:
在这里很明显int *没有有关基础数组的任何信息,但是如果您使用模板通过引用传递数组,则上面的代码将起作用。由于引用数组保留有关基础数组的信息,其类型将为int [4],而不是int *。
现在让我们讨论对数组的引用。
方法:
- 天真的方法
- 引用数组
方法1:天真的方法
首先,下面以句法描述我们想到的最常见的方式。显然,这是一种幼稚的方法,因为它失去了其阵列标识。
int a[] = {1, 2, 3, 4};
int *b = a;
Note: int a[] = b; will not work as array can only be initialized using aggregate object
方法2 :引用数组
- 需要指出大小,因为从编译器的角度来看,int [x]和int [y]是不同的数据类型。
- 声明时需要初始化对数组的引用。
- (&名称) 不是多余的。它有自己的含义。
句法:
data_type (&name)[size] = array;
Note: data_type &name[size] is incorrect because it means an array of reference to some datatype which is clearly meaningless. By doing so we have “name” of data type int (&) [] which is, of course, different from int[]
例子:
C++
// C++ Program to demonstrate Reference to an Array
// Importing input outut classes
#include
using namespace std;
// Main driver method
int main()
{
// Creating and initializing an integer array
// Custom input entries
int a[]{ 1, 2, 3, 4 };
// int (&b)[] = a;
// Declaring this way wont work as an error will be
// thrown invalid initialization of reference of type
// ‘int (&)[]’ from expression of type ‘int [4]’ Here
// you see compiler refered to "a" as int [4] not int*
int(&b)[4] = a;
// Iterating over elements using foreach loop
for (int e : b) {
// Print the elements of the array
cout << e << " ";
}
}
输出
1 2 3 4
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。