2016-11-07 3 views
1

Имея структурууказатели и указатели на ссылки

struct Person{ 
    Person(int i):id(i){}; 
    Person * next; 
    int id; 
}; 

class Test{ 
public: 
    void addList(Person *&f , Person *&l , int i){ 

     Person *tmp = new Person(i); 
     if(f == nullptr){ 

      f = tmp; 
      l = tmp; 
      return; 
     } 

     first -> next = tmp; 
     last = tmp; 
    } 
    void addArr(int *arr , int i){ 
     arr[index++] = i; 
    } 
    void print(){ 
     for(int i = 0; i < index; i ++) 
      cout << arr[i] << " "; 
     cout << endl; 
    } 
    Person *first = nullptr; 
    Person *last = nullptr; 
    int index = 0; 
    int *arr = new int[10]; 
}; 

функцию addList добавить узел в связный список и addArr добавляет элемент в arr. Мой вопрос касается указателя и указателя ссылки.

в

void addList(Person *&f , Person *&l , int i){ 

    Person *tmp = new Person(i); 
    if(f == nullptr){ 

     f = tmp; 
     l = tmp; 
     return; 
    } 

    first -> next = tmp; 
    last = tmp; 
} 

Мне нужно передать указатель в качестве ссылки. В противном случае локальная копия указателя будет изменена не внешней. Я предполагаю, что компилятор создает что-то вроде

Person *temporary = new Person(*f); 

Но разве мне не нужно передавать массив по ссылке? Я довольно смущен этим фактом.

ответ

1

Но разве мне не нужно передавать массив по ссылке?

Не в этом случае, передавая свой Person указатель по ссылке в функции addList, вы можете изменить сам указатель. Это как сказать: «Указатель, используйте другой адрес«. Это возможно, поскольку оно было передано по ссылке.

Принимая во внимание, что в вашей функции addArr вы не изменяете указатель на массив. Скорее, вы изменяете данные, на которые указывает. "Указывается на данные, используйте другое значение". Эти данные arr указывают на то же, что и данные за пределами функции.

Итак, нет, вам не нужно передавать массив по ссылке.

+0

так что если первый/последний уже указал на первый элемент, я мог бы просто передать указатель без ссылки? –

+0

Да, вы могли бы. Вам нужно только передать указатель по ссылке (или как указатель на указатель), если вы хотите изменить сам указатель. –