Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
1

Указатель на двумерный массив

02.01.2019, 15:11. Показов 2409. Ответов 27

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
#include <iostream>
using namespace std;
 
int a[10][10] = { 0 }, b[10][10] = { 1 };
 
void foo(int val) {
    int *arr;
    if (val == 1)
        arr = &a[0][0];
    else
        arr = &b[0][0];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << arr[i][j];//тут подчеркивается j и ошибка С2109 
        }
        cout << endl;
    }
}
 
int main() {
    foo(1);
    foo(2);
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2019, 15:11
Ответы с готовыми решениями:

Указатель на двумерный массив
A эквивалентно *(*(A+i)+j). Просто давайте допустим, что у нас матрица A. Как вычислить допустим А?

указатель на двумерный массив
Делая игру морской бой, я столкнулся с 1-ой проблемой: void place_ships(char &amp;(&amp;(map+13)+29))...

Указатель на двумерный массив
Допустим, у меня есть функция: void A(float **b) { b=1; } Тогда почему выдает ошибку при...

Указатель на двумерный массив
Здравствуйте. Программирую в Visual Studio 2017, на скриншоте собственно сама проблема. Как все так...

27
8 / 5 / 3
Регистрация: 02.01.2019
Сообщений: 16
02.01.2019, 15:22 2
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
#include <iostream>
using namespace std;
 
int a[10][10]{0}, b[10][10]{1};
 
void foo(int val) {
    int *arr;
    if (val == 1)
        arr = &a[0][0];
    else
        arr = &b[0][0];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << *(arr+i+j);
        }
        cout << endl;
    }
}
 
int main() {
    foo(1);
    foo(2);
    return 0;
}
0
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
02.01.2019, 15:27  [ТС] 3
Цитата Сообщение от Romsik788 Посмотреть сообщение
*(arr+i+j)
А можно по подробнее как это работает?
0
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
02.01.2019, 15:31 4
HLOPIC, у тебя int *arr; а нужно int **arr;

Добавлено через 3 минуты
Цитата Сообщение от HLOPIC Посмотреть сообщение
А можно по подробнее как это работает?
оно не правильно работает.
0
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
02.01.2019, 15:33  [ТС] 5
А так тогда вот что
0
Миниатюры
Указатель на двумерный массив  
8 / 5 / 3
Регистрация: 02.01.2019
Сообщений: 16
02.01.2019, 15:35 6
Цитата Сообщение от _stanislav Посмотреть сообщение
оно не правильно работает.
Да да, писал на скорую руку, приношу свои извинения
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
02.01.2019, 15:38 7
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
#include <iostream>
using namespace std;
 
int a[10][10] = { 0 }, b[10][10] = { 1 };
 
void foo(int val) {
    int *arr;
    if (val == 1)
        arr = &a[0][0];
    else
        arr = &b[0][0];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << (&arr[i])[j];
        }
        cout << endl;
    }
}
 
int main() {
    foo(1);
    foo(2);
    return 0;
}
0
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
02.01.2019, 15:39  [ТС] 8
Так как правильно будет?

Добавлено через 1 минуту
Цитата Сообщение от L0M Посмотреть сообщение
(&arr[i])[j]
А это как работает?
0
8 / 5 / 3
Регистрация: 02.01.2019
Сообщений: 16
02.01.2019, 15:41 9
Цитата Сообщение от HLOPIC Посмотреть сообщение
Так как правильно будет?
Хотелось бы знать как тебе надо?
0
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
02.01.2019, 15:47  [ТС] 10
Лучший ответ Сообщение было отмечено valen10 как решение

Решение

Чтобы понятно было и можно было использовать и в других проектах.
0
8 / 5 / 3
Регистрация: 02.01.2019
Сообщений: 16
02.01.2019, 15:59 11
Цитата Сообщение от HLOPIC Посмотреть сообщение
Чтобы понятно было и можно было использовать и в других проектах.
Решил для тебя ввиде комментариев описать что да как происходит
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
#include <iostream>
using namespace std;
 
int a[10][10] = { 0 }, b[10][10] = { 1 };
 
void foo(int val) {
    int *arr ; //объявляем указатель
    if (val == 1)
        arr = &a[0][0]; // присваиваем arr ccылку на массив a
    else
        arr = &b[0][0];// присваиваем arr ccылку на массив b
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << (&arr[i])[j]; //выводим значение хранимое в массиве (ссылка, указывает на адресс массива, который был записан в указателе arr) с помощью индексов.
        }
        cout << endl;
    }
}
 
int main() {
    foo(1);
    foo(2);
    return 0;
}
1
0 / 0 / 1
Регистрация: 06.08.2018
Сообщений: 14
02.01.2019, 16:06  [ТС] 12
C++
1
2
3
if (up == true && arr[x - 1][y] == 4) {
        arr[x - 1][y] = 3;
    }
эта не правильная запись(если смотреть через указатели) ,будет отображать суть этой
C++
1
2
3
if (up == true && (&arr[x-1])[y] == 4) {
        arr[x - 1][y] = 3;
    }
это ведь так?
0
8 / 5 / 3
Регистрация: 02.01.2019
Сообщений: 16
02.01.2019, 16:36 13
Лучший ответ Сообщение было отмечено HLOPIC как решение

Решение

Цитата Сообщение от HLOPIC Посмотреть сообщение
это ведь так?
Если через указатели - да
1
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
02.01.2019, 18:19 14
Цитата Сообщение от HLOPIC Посмотреть сообщение
Так как правильно будет?
Правильно будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int a[10][10] = { 0 }, b[10][10] = { 1 };
 
void bar(int arr[][10]) {
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << arr[i][j];
        }
        cout << endl;
    }
}
 
int main() {
    bar(a);
    bar(b);
    return 0;
}
Цитата Сообщение от HLOPIC Посмотреть сообщение
Сообщение от L0M
(&arr[i])[j]
А это как работает?
Во-первых, прошу прощения за ошибку. Должно быть так:
C++
1
(&arr[i * 10])[j]
Я опечатался, и никто не заметил.

Выражение
C++
1
arr = &a[0][0];
в arr заносит адрес начала массива, но массив интерпретируется как одномерный. Т.е. совершенно законно можно написать
C++
1
2
for (int i = 0; i < 10*10; ++i)
    cout << arr[i];
При этом честно распечатаются все 100 элементов массива.
Причём такая фишка с динамическим двумерным массивом не пройдёт.

А в выражении
C++
1
(&arr[i * 10])[j]
берётся адрес каждого десятого элемента массива (это как раз первый (нулевой) элемент очередной строки, если массив рассматривать как двухмерный), и от этого адреса индексируем 10 элементов по столбцам.

Если чисто через указатели, то можно написать
C++
1
2
3
4
5
6
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << *(arr + i * 10 + j);
        }
        cout << endl;
    }
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.01.2019, 22:23 15
Цитата Сообщение от L0M Посмотреть сообщение
совершенно законно можно написать
Кучу раз уже показывалось, что законно писать это нельзя. Это UB.
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
02.01.2019, 22:45 16
Цитата Сообщение от rat0r Посмотреть сообщение
Кучу раз уже показывалось, что законно писать это нельзя. Это UB.
С чего бы UB?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.01.2019, 22:53 17
Цитата Сообщение от L0M Посмотреть сообщение
С чего бы UB?
Так стандарт говорит.
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
02.01.2019, 23:07 18
Цитата Сообщение от rat0r Посмотреть сообщение
Так стандарт говорит.
Стандарт много чего говорит и много о чём умалчивает. Цитату в студию.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.01.2019, 23:12 19
L0M, https://www.cyberforum.ru/goog... D0%B2%20ub
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
02.01.2019, 23:35 20
rat0r, я просил вас привести цитату из стандарта, в которой говорится, что элементы статического многомерного массива, не обязаны занимать смежные блоки памяти.

Вместо этого вы мне вывалили порядка сотни ссылок на обсуждения в этом форуме. При всём уважении к мнению форумчан, буква Стандарта для меня первичнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2019, 23:35

Указатель на двумерный массив
Как сделать то же самое с двумерным массивом? Как работать с двумерными или n- мерными массивами...

Указатель на двумерный массив
Здравствуйте. Подскажите пожалуйста, а существуют ли в C/C++ указатели: 1) на двух-трёхмерные...

Указатель на двумерный массив
Возможно ли создать указатель на двумерный массив для вызова его в функции?

Указатель на двумерный массив
хочу заменить вот такую запись: fs.read((char*)&amp;size_struct, sizeof(int));...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.