Как передать массив по ссылке в моих фактических параметрах

Я столкнулся с ошибкой, когда пытался передать массив по ссылке, используя int(& a)[5]. Но когда я хочу это реализовать, мы должны передать ссылку, которую я инициализирую как int & refer=*a; Ниже приведен мой код и два способа передать ссылку и указатель на вызывающую функцию. Как объяснить, что я не могу просто передать в него ссылку?

 #include <iostream>

using namespace std;

void add(int (&)[5],int );
int main()
 {


int a[5]={5,4,3,2,1};
int len=sizeof(a)/sizeof(a[0]);
cout<<"len="<<len<<endl;
cout<<"a="<<a<<endl;// the name of array is actually the pointer

int& refer=*a;

add(a,len);    //which is correct,we pass a pointer to the calling function;
add(refer,len);   //which is wrong,we pass a reference to the calling function;
for(int i=0;i<len;i++){
    cout<<a[i]<<" ";
}

return 0;
}



void add(int (&a)[5],int len){
  for(int i=0;i<len;i++){
   a[i]=a[i]+10;
  }
}

person user3570984    schedule 02.10.2014    source источник
comment
Если add принимает только массив размером 5, зачем вы передаете длину? Вам нужно только int a[] передать массив для модификации в функцию. В C++ вы можете использовать std::vector<int>& и воспользоваться тем фактом, что вектор знает свой размер.   -  person Neil Kirk    schedule 02.10.2014
comment
Потому что я хочу знать, сколько раз я должен зацикливаться. Когда я передаю [] в вызывающую функцию, a[] распадается на указатель на первый элемент. В этом смысле я потерял бы свою информацию о размере этого массива, что означает, что я должен добавить длину моего массива вместе .   -  person user3570984    schedule 02.10.2014
comment
@ user3570984: С этой подписью a не превращается в указатель, поэтому вы знаете размер (и можете удалить int len).   -  person Jarod42    schedule 02.10.2014
comment
Но размер тут же, в сигнатуре функции!   -  person Neil Kirk    schedule 02.10.2014


Ответы (1)


int& refer=*a;

Это ссылка не на массив, а на его первый элемент. Пытаться:

int (&refer)[5] = a;
add(refer,len);
person AlexD    schedule 02.10.2014
comment
Что касается int(&refer)[5] = a; Я не совсем понимаю, почему вы можете назначать указатель, например, на ссылку. - person user3570984; 02.10.2014
comment
@ user3570984: Потому что a не указатель. Это массив. Выражение a затухает до указателя в определенных контекстах, по существу там, где ожидается указатель. Также обратите внимание, что это не присваивание. Это инициализация, хотя и выраженная знаком =. - person Cheers and hth. - Alf; 02.10.2014
comment
@user3570984 user3570984 Вы можете иметь ссылку на массив (или указатель) почти так же, как ссылку на целое число. Строка int (&refer)[5] = a; говорит, что refer является ссылкой на a. - person AlexD; 02.10.2014