Я не понимаю суть *& в С++ UPD. Не могу найти ошибку в коде

учу C++ по виду на ютубе, и застрял на теме изменения динамический массивов, передаваемых в функцию. Вот видео: https://www.youtube.com/watch?v=fzNksn5wPTg&list=PLQOaTSbfxUtCrKs0nicOg2npJQYSPGO9r&index=80&ab_channel=%23SimpleCode

Я пытался сам понять, что значит *& , но не вдупляю. Буду благодарен за объяснение.

#include <iostream>
using namespace std;

int main()
{
    int a = 25;

    cout << "&a " << &a << endl; // &a 0x21eeb8

    int *pA = &a;
    cout << "*a " << pA <<endl; //*a 0x21eeb8
    cout << "*a " << *pA <<endl; // *a 25

    cout << "*&a " << *&a<< endl; //*&a 25
}

UPD. Я должен был написать динамический массив, который копируется в другой массив на 1 элемент больше, но при выводе у меня некоторые элементы не совпадают, ошибка где-то в фунции Increase.

#include <iostream>
using namespace std;
void Fill(int arr[],const int size);
void Show(int arr[],const int size);
void Increase(int arr[],int &size,const int value);

int main()
{
    int value = 999;

    int size = 5;
    int *arr = new int[size]; // выделяем память под массив

    Fill(arr,size); // заполняем массив arr

    Show(arr,size); //  выводим массив arr
        cout << endl<< "arr "<<arr << endl;

    Increase(arr,size,value); // Увеличиваем массив на 1

    cout << endl;

    Show(arr,size); // выводим обновлённый массив 
        cout << endl<< "arr "<<arr << endl;
    delete [] arr; // удаляем массив arr 
}

void Fill(int arr[],const int size)
{
    for (int i = 0; i < size; i++)
    {
        arr[i] = rand() % 10;
    }
}

void Show(int arr[],const int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << arr[i] << " ";
    }    
}

 void Increase(int arr[],int &size,const int value)
{
    int *newArr = new int[size + 1]; //выделяем место под новый массив на 1 эл. больше

    for (int i = 0; i < size; i++)
    {
        newArr[i] = arr[i]; // копируем массив arr в newarr
    }

    size++; // Увеличиваем длинну массива на 1

    newArr[size] = value; // Замняем 6 элемент на value

    delete [] arr; // удаляем массив arr

    arr = newArr;
} 

Благодарю за ответы, пойду смотреть лекции, как раз скоро на 1 курс.


Ответы (1 шт):

Автор решения: Harry

Итак,

*&a == *(&a)

&a - адрес a, указатель, указывающий на память, где находится a.

*&a - разыменованный указатель &a, т.е. значение, на которое указывает указатель. А указывает он (&a) на память, где находится a, т.е. *&a == a...

К вашему обновленному вопросу (ой, не надо так поступать, кардинально меняя вопрос по ходу дела!).

Вы передаете указатель по значению, так что

arr = newArr;

внутри функции никак не меняет arr вне функции. Да и

size++; // Увеличиваем длинну массива на 1
newArr[size++] = value; // Замняем 6 элемент на value

неверно — вылетаете за границу массива.
Можно сделать так:

void Increase(int **arr,int &size,const int value);

...

Increase(&arr,size,value); // Увеличиваем массив на 1

...

void Increase(int **arr,int &size,const int value)
{
    int *newArr = new int[size + 1]; //выделяем место под новый массив на 1 эл. больше

    for (int i = 0; i < size; i++)
    {
        newArr[i] = (*arr)[i]; // копируем массив arr в newarr
    }

    //size++; // Увеличиваем длинну массива на 1

    newArr[size++] = value; // Замняем 6 элемент на value

    delete [] *arr; // удаляем массив arr

    *arr = newArr;
}

Можно и со ссылкой:

void Increase(int *&arr,int &size,const int value);

...

Increase(arr,size,value); // Увеличиваем массив на 1

...


void Increase(int *&arr,int &size,const int value)
{
    int *newArr = new int[size + 1]; //выделяем место под новый массив на 1 эл. больше

    for (int i = 0; i < size; i++)
    {
        newArr[i] = arr[i]; // копируем массив arr в newarr
    }

    //size++; // Увеличиваем длинну массива на 1

    newArr[size++] = value; // Замняем 6 элемент на value

    delete [] arr; // удаляем массив arr

    arr = newArr;
}
→ Ссылка