Я не понимаю суть *& в С++ 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 шт):
Итак,
*&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;
}