📜  在C++中对数组的引用

📅  最后修改于: 2021-05-30 03:53:53             🧑  作者: Mango

引用数组意味着在保留其标识的同时对数组进行别名。对数组的引用将不是int *,而是int []。让我们通过讨论两者之间的区别来详细讨论这一点。奇怪的是, int []int *相同,但是两者的编译器视角却完全不同。主要的两个区别如下:

  1. 编译器的int []是一个数组,因此它为此提供了一个迭代器(这就是为什么有For-Each循环的原因),但是int *只是一个指向整数的指针。这可能只是指向整数的指针,也可能是指向整数数组开头的指针,这完全取决于我们的观点。因此,在这种情况下,没有For-Each循环。
  2. 对于编译器,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. 天真的方法
  2. 引用数组

方法1:天真的方法

首先,下面以句法描述我们想到的最常见的方式。显然,这是一种幼稚的方法,因为它失去了其阵列标识。

int a[] = {1, 2, 3, 4};
int *b = a;

方法2 :引用数组

  • 需要指出大小,因为从编译器的角度来看,int [x]和int [y]是不同的数据类型。
  • 声明时需要初始化对数组的引用。
  • (&名称) 不是多余的。它有自己的含义。

句法:

data_type (&name)[size] = array;

例子:

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等的更多准备工作,请参阅“完整面试准备课程”