Имя массива - ссылка или указатель? С++

Рейтинг: 0Ответов: 2Опубликовано: 09.03.2023

Заранее прошу прощения, если вопрос слишком простой. Учусь по самоучителю Васильева А. Н. В одной из глав, посвященной передаче массива аргументом функции, автор говорит, цитата: "...Учитывая то обстоятельство, что имя массива является ссылкой на первый его элемент...". А уже страницу спустя, пишет следующее: "...Поэтому разумнее, принимая во внимание сказанное, передавать массив в виде указателя, благо таковым является имя массива..."

Ранее я читал формулировку, что ссылка, это утрированно указатель со скрытым адресом. Но все-таки это разные понятия. Так что же все-таки такое имя массива?

И вопрос на засыпку, почему при передаче массива аргументом, для указателя при объявлении используется "*", а для ссылки "&" - нет?

Ответы

▲ 0Принят

Это всё разные типы

  • int [ ] массив
  • int ( & ) [ ] ссылка на массив
  • int ( * ) [ ] указатель на массив
  • int * указатель на первый элемент

Есть много способов передачи массивов аргументом. Рассмотрим только три (массивы функциям по значению полностью не передаются) :

  • указатель на первый элемент
  • указатель на массив
  • ссылка на массив

Классически передают все указатель на первый элемент, так как это даёт универсальность функции, для обработки массивов разного размера. А в остальных случаях функция будет способна работать только с массивов определённого размера, так как типы например int [2] и int [4] - разные.

// указатель на первый элемент

// void fun6(int * x) фактически
void fun6(int x[6]){    
}

// void fun12(int * x) фактически
void fun12(int x[12]){    
}

// ссылка на массив

void funl6(int (&x)[6]){
}

void funl12(int (&x)[12]){
}

// указатель на массив

void funp6(int (*x)[6]){
}

void funp12(int (*x)[12]){
}

int main(){
    int a[6];
    int b[12];
    fun6(a);
    fun6(b);
    fun12(a);
    fun12(b);
    funl6(a);
    //funl6(b); ошибка разных типов
    //funl12(a); ошибка разных типов
    funl12(b);
    funp6(&a);
    //funp6(&b); ошибка разных типов
    //funp12(&a); ошибка разных типов
    funp12(&b);
}

Первые функции на самом деле принимают указатель на первый элемент и им не важны размеры массивов. Они универсальны.
В остальных случаях функции принимают только массивы указанного размера.

▲ -2

Конечно указатель, а как иначе:

#include <iostream>


int main()
{
    int *arr = new int[5]{1,2,3,4,5};
    
    std::cout << *arr << std::endl;

    delete []arr;

    return 0;
}