Ссылка на массив в C++

Опубликовано: 14 Сентября, 2022

Ссылка на массив означает псевдоним массива с сохранением его идентичности. Ссылка на массив будет не int*, а int[]. Давайте обсудим это подробно, обсудив разницу между этими двумя. Довольно странно, что int[] — это то же самое, что и int* , но взгляды компилятора на них совершенно разные. Основные два отличия заключаются в следующем:

  1. int[] для компилятора — это массив, поэтому он предоставляет для этого итератор (вот почему у нас есть цикл For-Each), но int* — это просто указатель на целое число. Это может быть просто указатель на целое число или указатель на начало массива целых чисел, что полностью зависит от нашей точки зрения. Следовательно, в этом случае нет цикла For-Each.
  2. Для компилятора a и b являются одним и тем же типом данных, т.е. int* здесь для компилятора они просто int* указывают на адрес. Но для компилятора тип массива — 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 <iostream>
 
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 created above
    // in the main) method to
    // print array elements
    print(a, size);
}


Выход:

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;

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++