Имя массива - ссылка или указатель? С++
Заранее прошу прощения, если вопрос слишком простой. Учусь по самоучителю Васильева А. Н. В одной из глав, посвященной передаче массива аргументом функции, автор говорит, цитата: "...Учитывая то обстоятельство, что имя массива является ссылкой на первый его элемент...". А уже страницу спустя, пишет следующее: "...Поэтому разумнее, принимая во внимание сказанное, передавать массив в виде указателя, благо таковым является имя массива..."
Ранее я читал формулировку, что ссылка, это утрированно указатель со скрытым адресом. Но все-таки это разные понятия. Так что же все-таки такое имя массива?
И вопрос на засыпку, почему при передаче массива аргументом, для указателя при объявлении используется "*", а для ссылки "&" - нет?
Ответы (2 шт):
Конечно указатель, а как иначе:
#include <iostream>
int main()
{
int *arr = new int[5]{1,2,3,4,5};
std::cout << *arr << std::endl;
delete []arr;
return 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);
}
Первые функции на самом деле принимают указатель на первый элемент и им не важны размеры массивов. Они универсальны.
В остальных случаях функции принимают только массивы указанного размера.