143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
1

Как переключить указатель с одного массива на другой

06.02.2020, 06:35. Показов 3106. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Значит смысл следующий. Есть массив int Massiv[1][1]; далее будет создан второй массив int Massiv[10][4]; Я хочу удалить первый массив Massiv[1][1], а указатель переключить на 2ой массив Massiv[10][4], тем самым поменяются параметры массива по столбцам и строкам. Можно ли так сделать? Человек в видео (16:48) https://www.youtube.com/watch?v=fzNksn5wPTgпоказал что можно но у меня не получается, не работает его код int *&arr, да и к тому же я работаю с многомерными массивами.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2020, 06:35
Ответы с готовыми решениями:

Передать значение из одного класса в другой через указатель
Я не могу додуматься что тут не так class Car { private: int weight; public: Car(int w)...

Как переключить беспроводную сеть с одного компьютера на другой?
У меня, собственно, такая проблема: дома есть безлимитный волгателекомовский, беспроводной...

Передать указатель на функцию из одного класса в другой
Доброго времени суток. Долго рылся на форуме и в инете в целом, но так и не нашел ответа на вопрос:...

Как из одного двумерного массива сформировать другой
отпечатать массив Х в виде матрицы.составить другой массив Y из элементов массива Х, заменив нулями...

18
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
06.02.2020, 07:07 2
Nexi99,
C++
1
2
3
4
5
6
int a[][2]
{
    1, 2, 
    3, 4
};
int* p = &a[0][0];
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
06.02.2020, 07:47  [ТС] 3
Я знаю про этот трюк, и что мне с этим р делать. Такое впечатление что мои вопросы даже не читают. А куда мне р этот присваивать? Сначала я обращался к а[0][0] теперь р опять равно а[0][0] да и к тому же куда его деть.
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
06.02.2020, 08:15 4
Цитата Сообщение от Nexi99 Посмотреть сообщение
тем самым поменяются параметры массива по столбцам и строкам.
что ты имеешь ввиду под параметрами массива?

Добавлено через 1 минуту
можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
int main()
{
    constexpr int s1 = 2;
    constexpr int s2 = 2;
 
    int a1[s1][s2]
    {
        1, 2,
        3, 4
    };
 
    constexpr int s3 = 2;
    constexpr int s4 = 3;
 
    int a2[s3][s4]
    {
        1, 2, 3,
        4, 5, 6
    };
 
    int* p = &a1[0][0];
    for(int i = 0; i < s1 * s2; ++i) // работаешь с одним массивом
        std::cout << p[i] << ' ';
 
    std::cout << std::endl;
 
    p = &a2[0][0];
    for(int i = 0; i < s3 * s4; ++i) // работаешь с другим массивом
        std::cout << p[i] << ' ';
 
    return 0;
}
а двумерный указатель не получиться сделать.

Добавлено через 12 минут
может ты имел ввиду это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
constexpr int s1 = 2;
constexpr int s2 = 2;
 
void Show(int (&a)[s1][s2] )
{
    for (int i = 0; i < s1; ++i)
    {
        for (int j = 0; j < s2; ++j)
        {
            std::cout << a[j][i] << ' ';
        }
 
        std::cout << std::endl;
    }
}
 
int main()
{
    int a[s1][s2]
    {
        1, 2,
        3, 4
    };
 
    Show(a);
 
    return 0;
}
в функцию передается ссылка на двумерный массив, и обход идет сверху вниз, слева на право
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
06.02.2020, 08:16  [ТС] 5
Цитата Сообщение от _stanislav Посмотреть сообщение
можно сделать так:
Я хочу чтобы указатель a1[0][0] указывал на а2[0][0].
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
06.02.2020, 08:17 6
Цитата Сообщение от Nexi99 Посмотреть сообщение
указатель a1[0][0]
это не указатель а массив.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
06.02.2020, 08:18  [ТС] 7
Цитата Сообщение от _stanislav Посмотреть сообщение
это не указатель а массив.
Вообще-то это уже значение а массив здесь а1
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.02.2020, 08:23 8
Цитата Сообщение от Nexi99 Посмотреть сообщение
Сначала я обращался к а[0][0] теперь р опять равно а[0][0]
Не "опять", а "все еще".
Можно же дополнить пример:

Цитата Сообщение от Nexi99 Посмотреть сообщение
Я хочу чтобы указатель a1[0][0] указывал на а2[0][0].
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a1[][2]
{
    1, 2, 
    3, 4
};
int a2[][2]
{
    5, 6, 
    7, 8
};
int* p = &a1[0][0]; // сначала указывает на a1[0][0]
 
//....
 
p = &a2[0][0]; // теперь указывает на a2[0][0]
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
06.02.2020, 16:05  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно же дополнить пример:
Ну а как связать p с массивом. Сначала я пользовался a1[][2] позже переключился на a2[][2], написать функцию и сделать это внутри функции и указатель перенаправится на a2[][2]?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
06.02.2020, 16:13 10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Ну а как связать p с массивом.
https://pp.userapi.com/c639420... TKvPLA.jpg
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.02.2020, 17:22 11
Цитата Сообщение от Nexi99 Посмотреть сообщение
Ну а как связать p с массивом.
В 11 и 15 строках как раз и связывается.
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
06.02.2020, 17:39 12
Nexi99, может имелось в виду нечто такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
int**  CreateArray(int rows, int cols)
{
    int** a = new int*[rows];
    for (int i = 0; i < rows; i++)
        a[i] = new int[cols];
    return a;
}
 
void DeleteArray(int** arr, int rows)
{
    for (int i = 0; i < rows; i++)
        delete[] arr[i];
    delete[] arr;
}
 
int main()
{
    int n = 1;
    int m = 1;
    
    int** Massiv = CreateArray(n, m);
//что-то делаем
    DeleteArray(Massiv, n);
    
    n = 10;
    m = 4;
    Massiv = CreateArray(n, m);
//что-то делаем
    DeleteArray(Massiv, n);
 
    return 0;
}
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
07.02.2020, 01:37  [ТС] 13
Я вот так хотел сделать но не знаю насколько корректно это работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include <conio.h>
#include <iostream>
//#include <string>
 
 
using std::cout;
using std::endl;
using std::cin;
 
using namespace std;
 
 
void MenUkas(int *arr){//функция принимающая массив через указатель( может некорректно написал)
cout<<"Pervyi masiv arr "<<arr<<endl;//выводим адрес 1го массива который мы передали
int *mas=new int[2];// создаём новый массив пробовал так int mas[2] в месте удаления вылет
cout<<"Novyi masiv mas "<<mas<<endl;//выводим адрес нового массива
arr=mas;// присваиваем старому указателю новые координаты от массива mas
cout<<"Perenapravil arr=mas "<<arr<<endl;//выводим проверяем изменились ли координаты
delete []arr;//удаляем старый массив
cout<<"Posle udaleniya "<<arr<<endl;// проверяем что произошло со старым указателем
//(он меняется может я что-то делаю не так)
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int  var;     /* переменная       */
    int *ptr[2];     /* объявление ук-ля */
        //  ptr = & var;
    int Mas[1];//создаём массив который будем менять
    MenUkas(Mas);//вызываем функцию
    _getch();
    return 0;
}
Добавлено через 6 минут
Посмотрите мой последний комментарий правильно ли я сделал.

Добавлено через 8 минут
нет если удаляешь указатель теряется вот выяснил так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void MenUkas(int *arr){
cout<<"Pervyi masiv arr "<<arr<<endl;
int *mas=new int[5];
for(int y=-1;++y<5;)
mas[y]=y+1;
cout<<"Novyi masiv mas "<<mas<<endl;
arr=mas;
cout<<"Perenapravil arr=mas "<<arr<<endl;
delete []arr;
cout<<"Posle udaleniya "<<arr<<endl;
for(int y=-1;++y<5;)
    cout<<arr[y]<<endl;
}
Добавлено через 8 минут
вот так ещё записал в функции указатель переключился а снаружи нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include <conio.h>
#include <iostream>
//#include <string>
 
 
using std::cout;
using std::endl;
using std::cin;
 
using namespace std;
 
 
void MenUkas(int *arr/*,int arrr[]*/){
cout<<"Pervyi masiv arr "<<arr<<endl;
int *mas=new int[5];
for(int y=-1;++y<5;)
mas[y]=y+1;
cout<<"Novyi masiv mas "<<mas<<endl;
arr=mas;
cout<<"Perenapravil arr=mas "<<arr<<endl;
//delete []arr;
//cout<<"Posle udaleniya "<<arr<<endl;
for(int y=-1;++y<5;)
    cout<<arr[y]<<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int  var;     /* переменная       */
    int *ptr[2];     /* объявление ук-ля */
        //  ptr = & var;
    int Mas[1];
    MenUkas(Mas);
    cout<<"Vyvod int Mas[1]"<<endl;
    for(int y=-1;++y<5;)
    cout<<Mas[y]<<endl;
 
    _getch();
    return 0;
}
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
07.02.2020, 10:46 14
Nexi99, чтобы изменить указатель в функции, нужно передавать указатель на указатель, либо ссылку. Сама смена делается в две строчки:
C++
1
2
3
4
5
void MenUkas(int* &arr) 
{
    delete [] arr; 
    arr=new int[5];
}
Изначальный массив должен быть динамический:
C++
1
2
3
int *Mas = new int[3];
...
MenUkas(Mas);
0
151 / 103 / 49
Регистрация: 21.11.2019
Сообщений: 285
07.02.2020, 14:49 15
elenayagubova, в теме речь идет про двумерный массив.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
07.02.2020, 15:01 16
Shut913, я поняла, я отвечала на самое последнее сообщение Nexi99, где он одномерный
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
08.02.2020, 23:30  [ТС] 17
Цитата Сообщение от elenayagubova Посмотреть сообщение
я поняла, я отвечала на самое последнее сообщение Nexi99, где он одномерный
Я уже понял. Скажите а почему сначала выполняется delete [] arr; а потом происходит присвоение указателю нового участка, разве операция delete [] arr не удаляет сам указатель вместе с массивом?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.02.2020, 23:39 18
Цитата Сообщение от Nexi99 Посмотреть сообщение
разве операция delete [] arr не удаляет сам указатель вместе с массивом?
операция delete ничего не удаляет, а просто помечает память уже не нужную, как свободную для использования другими
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
09.02.2020, 00:13  [ТС] 19
Цитата Сообщение от Azazel-San Посмотреть сообщение
операция delete ничего не удаляет, а просто помечает память уже не нужную, как свободную для использования другими
Понятно спасибо за информацию.
0
09.02.2020, 00:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2020, 00:13
Помогаю со студенческими работами здесь

Как перенести элементы из одного массива в другой?
как перенести элементы из одного массива в другой ? пример: 5, 6, 7, 8 ,9 хочу перенести только...

Как перенести элемент одного массива в другой?!
Помогите плиз! Нужно перенести элемент массива с четными индексом из одного массива в другой......

Как скопировать содержимое одного массива в другой?
Всё тот же магазин. Осталось только одно, копировать содержимое из одного массива, в другой. Я уже...

Как взять данные из одного массива и вставить в другой
Есть два jsona, успешно разобраны с помощью json_decode. Один вот такой {&quot;data&quot;: } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru