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

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

02.01.2019, 15:11. Показов 3597. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2019, 15:11
Ответы с готовыми решениями:

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

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

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

27
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.01.2019, 23:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от L0M Посмотреть сообщение
я просил вас привести цитату из стандарта... Вместо этого вы мне вывалили порядка сотни ссылок на обсуждения в этом форуме.
Я думал ты догадаешься пройти по первой ссылке (или по второй). Ок, можешь начать отсюда Из одномерного массива сформировать двумерный массив
Там достаточно ссылок из стандарта.
Цитата Сообщение от L0M Посмотреть сообщение
буква Стандарта для меня первичнее
Вряд ли ты хоть раз заглядывал в релевантные разделы стандарта.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
03.01.2019, 02:09
Цитата Сообщение от rat0r Посмотреть сообщение
Вряд ли ты хоть раз заглядывал в релевантные разделы стандарта.
Вы всерьёз считаете, что в стандарт кроме вас и комитета по стандартизации никто не заглядывает?

Ок. Я почитал дискуссию по указанной вами ссылке. Среди цитат из стандарта я не нашёл
Цитата Сообщение от L0M Посмотреть сообщение
цитату из стандарта, в которой говорится, что элементы статического многомерного массива, не обязаны занимать смежные блоки памяти.
С другой стороны, по драфту стандарта C++17 №4659:
п.11.3.4 абзац 1
An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.
и вам это уже цитировали
п.11.3.4 абзац 3
When several “array of” specifications are adjacent, a multidimensional array type is created;
п.11.3.4 абзацы 7-8 (и 6, поскольку на него ссылка)
6 [ Note: Except where it has been declared for a class (16.5.5), the subscript operator [] is interpreted in
such a way that E1[E2] is identical to *((E1)+(E2)) (8.2.1). Because of the conversion rules that apply to
+, if E1 is an array and E2 an integer, then E1[E2] refers to the E2-th member of E1. Therefore, despite its
asymmetric appearance, subscripting is a commutative operation. —end note ]

7 [ Note: A consistent rule is followed for multidimensional arrays. If E is an n-dimensional array of rank
i × j × · · · × k, then E appearing in an expression that is subject to the array-to-pointer conversion (7.2)
is converted to a pointer to an (n − 1)-dimensional array with rank j × · · · × k. If the * operator, either
explicitly or implicitly as a result of subscripting, is applied to this pointer, the result is the pointed-to
(n − 1)-dimensional array, which itself is immediately converted into a pointer. [ Example: Consider

int x[3][5];

Here x is a 3 × 5 array of integers. When x appears in an expression, it is converted to a pointer to (the first
of three) five-membered arrays of integers. In the expression x[i] which is equivalent to *(x+i), x is first
converted to a pointer as described; then x+i is converted to the type of x, which involves multiplying i by
the length of the object to which the pointer points, namely five integer objects. The results are added and
indirection applied to yield an array (of five integers), which in turn is converted to a pointer to the first of
the integers. If there is another subscript the same argument applies again; this time the result is an integer.
—end example ] —end note ]

8 [ Note: It follows from all this that arrays in C++ are stored row-wise (last subscript varies fastest) and that
the first subscript in the declaration helps determine the amount of storage consumed by an array but plays
no other part in subscript calculations. —end note ]
Из вышепроцитированного следует, что многомерные статические массивы располагаются в (а) непрерывной области памяти и (б) располагаются "построчно".

Из (а) следует, что если объявлен многомерный массив arr[m][n], то эту непрерывную область памяти размером sizeof(arr[0][0]) * m * n, при содействии reinterpret_cast<>() или приведении типа в стиле С, можно интерпретировать как угодно. И никакого UB.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
03.01.2019, 02:50
Цитата Сообщение от L0M Посмотреть сообщение
Я почитал дискуссию по указанной вами ссылке. Среди цитат из стандарта я не нашёл
Зато там достаточно цитат и объяснений почему непрерывность не делает поведение определённым.

Цитата Сообщение от L0M Посмотреть сообщение
и вам это уже цитировали
Мне много чего цитируют и довольно часто не то.

Цитата Сообщение от L0M Посмотреть сообщение
многомерные статические массивы располагаются в (а) непрерывной области памяти и (б) располагаются "построчно".
Я это под сомнение и не ставил.

Цитата Сообщение от L0M Посмотреть сообщение
Из (а) следует, что если объявлен многомерный массив arr[m][n], то эту непрерывную область памяти размером sizeof(arr[0][0]) * m * n, при содействии reinterpret_cast<>() или приведении типа в стиле С, можно интерпретировать как угодно.
Из (a) ничего подобного не следует.

Цитата Сообщение от L0M Посмотреть сообщение
И никакого UB.
Ок, предположим это на секунду. Тогда какое объяснение этому Из одномерного массива сформировать двумерный массив ?
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
03.01.2019, 03:53
Цитата Сообщение от rat0r Посмотреть сообщение
Из (a) ничего подобного не следует.
Да-а-а? Т.е. вы хотите сказать, что выделенной области памяти всегда присущ некий тип, не всегда совпадающий с байтом? Я-то всегда думал (и, уверяю, я не одинок), что память выделяется в байтах, а уже потом явно или неявно происходит некая логическая интерпретация в виде типизации.

Цитата Сообщение от rat0r Посмотреть сообщение
Ок, предположим это на секунду. Тогда какое объяснение этому Из одномерного массива сформировать двумерный массив ?
А вот здесь не надо путать требования стандарта и конкретную реализацию. Вы не рассматриваете ситуацию, что компиляторы (пока) просто недостаточно интеллектуально считают constexpr'ы? Тем более, что код-то в итоге они генерируют правильный.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
constexpr int a[2][2] = { 1, 2, 3, 4 };
constexpr int get_third(int const * first) { return *(first + 2); }
//static_assert(get_third(&a[0][0]) == 3, "Wrong number.");
 
int main() {
    std::cout << (get_third(&a[0][0]) == 3 ? "Ok" : "Wrong") << std::endl;
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
03.01.2019, 04:31
Цитата Сообщение от L0M Посмотреть сообщение
Я-то всегда думал (и, уверяю, я не одинок)
В C++ такое не редкость. Многие думают что нечто определено, хотя стандарт говорит что это UB.

Цитата Сообщение от L0M Посмотреть сообщение
память выделяется в байтах, а уже потом явно или неявно происходит некая логическая интерпретация в виде типизации.
"А вот здесь не надо путать требования стандарта и конкретную реализацию."

Цитата Сообщение от L0M Посмотреть сообщение
Вы не рассматриваете ситуацию, что компиляторы (пока) просто недостаточно интеллектуально считают constexpr'ы?
Старый gcc компилировал этот код, хотя не должен был Как передать двухмерный массив в функцию по ссылке?
Ситуация недостаточно интеллектуальной обработки constexpr. Но это исправлено.
В общем, твоё объяснение: 3 независимых компилятора одинаково некорректно не принимают код с одинаковым (по смыслу, не буквально) сообщением об ошибке?

Цитата Сообщение от L0M Посмотреть сообщение
код-то в итоге они генерируют правильный.
Что такое "правильный код" для программы с UB?
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
03.01.2019, 14:37
Ок, свою позицию я подкрепил цитатами из стандарта.

Пожалуйста приведите цитату из стандарта, которая говорит, что в данном случае будет UB.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.01.2019, 14:51

Не по теме:

вам не надоело заниматься бессмысленным делом. нет ни какой разницы кто из вас прав.

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
04.01.2019, 00:25
Цитата Сообщение от L0M Посмотреть сообщение
свою позицию я подкрепил цитатами из стандарта.
Там было только про contiguously allocated и ещё несколько примечаний, которые не нормативны.
Цитата Сообщение от L0M Посмотреть сообщение
Из (а) следует, что если объявлен многомерный массив arr[m][n], то эту непрерывную область памяти размером sizeof(arr[0][0]) * m * n, при содействии reinterpret_cast<>() или приведении типа в стиле С, можно интерпретировать как угодно.
Вот это никак не было обосновано.

Цитата Сообщение от L0M Посмотреть сообщение
Пожалуйста приведите цитату из стандарта, которая говорит, что в данном случае будет UB.
Она есть в том треде, на который я уже давал ссылку. Из одномерного массива сформировать двумерный массив
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2019, 00:25

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru