Ссылка на массив в C++
Ссылка на массив означает псевдоним массива с сохранением его идентичности. Ссылка на массив будет не int*, а int[]. Давайте обсудим это подробно, обсудив разницу между этими двумя. Довольно странно, что int[] — это то же самое, что и int* , но взгляды компилятора на них совершенно разные. Основные два отличия заключаются в следующем:
- int[] для компилятора — это массив, поэтому он предоставляет для этого итератор (вот почему у нас есть цикл For-Each), но int* — это просто указатель на целое число. Это может быть просто указатель на целое число или указатель на начало массива целых чисел, что полностью зависит от нашей точки зрения. Следовательно, в этом случае нет цикла For-Each.
- Для компилятора 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: Наивный метод
Первый наиболее распространенный способ, который приходит нам на ум, описан ниже синтаксически. Это явно наивный подход, поскольку он теряет свою идентичность массива.
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[]
Пример: