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

Как передавать в функцию указатели на двумерный массив и как с помощью указателя двигаться по массиву?

08.10.2017, 03:01. Показов 3772. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые знатоки С++! Я долгое время работал в С#, но недавно перешел на С++, и у меня возникла следующая проблема. Задание такое: в основной программе есть несколько массивов, размерности NxN. N для каждого массива свое. Также у меня есть отдельная функция для создания нового массива и записи его в файл. Смысл задания - использовать для преобразования каждого из массивов основной программы данную функцию. Соответственно, нужно в эту функцию передавать все массивы по очереди. Напрямую в С++ это, насколько я понял, невозможно, и действовать нужно с помощью указателей. Собственно, в этом я и застопорился. Посему такой вопрос: может кто-нибудь объяснить, как передавать в функцию указатели на двумерный массив и как с помощью этого указателя двигаться по массиву, согласно определенной формуле? Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.10.2017, 03:01
Ответы с готовыми решениями:

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

Как правильно передавать двумерный массив в функцию
Компилятор Borland Builder C++ 6 Получил ошибку в основной программе, создал идентичную тестовую, привожу код. #include <stdio.h>...

Как с помощью указателя пройтись по двухмерному массиву?
Всем привет. Подскажите плиз. Как с помощью указателя пройтись по двухмерному массиву и выдать значения елементов. есть массив int...

3
Неэпический
 Аватар для Croessmah
18147 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
08.10.2017, 04:47
Всё зависит от того, как Вы устроили эти массивы.
0
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
08.10.2017, 08:17
Цитата Сообщение от kapablankaNew Посмотреть сообщение
Напрямую в С++ это, насколько я понял, невозможно, и действовать нужно с помощью указателей.
В C++ напрямую - это и есть с помощью указателей

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
void aa( int **arr, int m, int n )
{
   cout << arr[n][m];
}
 
int main()
{
    int **arr=new int*[10];//объявляем динамический массив с двумя размерностями
    for(int i=0;i<10;++i)
      arr[i]=new int[8];
 
    arr[5][5] = 5;
 
    aa(arr,5,5);
    return 0;
}
Добавлено через 51 минуту
Как известно в шарпе, да и vbnet тоже все передается через ссылки. Можно и через них:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
void aa(int (&arr)[10][8], int m, int n )
{
   cout << arr[m][n];
}
 
int main()
{
    int arr[10][8];
    int (&arrayref)[10][8] = arr;
    arrayref[0][1]=9;
 
    aa(arrayref,0,1);
    return 0;
}
Добавлено через 9 минут
Но в этом случае надо знать заранее размерность массива. Или использовать template.

Так как стиль программирования C++ построен на адресной математике, ссылки мало востребованы. Все пользуются указателями
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
08.10.2017, 08:43
Цитата Сообщение от netBool Посмотреть сообщение
int **arr=new int*[10];//объявляем динамический массив с двумя размерностями
for(int i=0;i<10;++i) arr[i]=new int[8];
Так лучше не делать. Это массив массивов, а не двумерный массив. Проще сразу выделить одномерный массив нужного размера и обращаться к его элементам по формуле:
C++
1
2
3
4
int *arr = new int[N*N];
arr[ x + N*y ] = val;
...
delete [] arr;
И точно так же передавать в функцию (если хочется, можно сделать обращение более удобным, через макросы)
C
1
2
3
4
5
#define ARR(x,y) arr[ x + N*y ]
void func(int *arr, int N){
  if(ARR(1,1) == 0)return;
}
#undef ARR
Здесь имена переменных в макросе совпадают с именами параметров функции и будут ими заменены. Можно, конечно, и их передавать в макрос, но это менее удобно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2017, 08:43
Помогаю со студенческими работами здесь

Как лучше передавать значения в функцию? Ссылки vs указатели
Всем доброго времени суток. Уважаемые гуру, подскажите пожалуйста, как лучше передавать значения в функцию, через указатель или ссылку? И...

Передача указателя на двумерный массив в функцию
Здравствуйте. Сильно не ругайтесь, в c++ недавно. Потихоньку подошел к указателям. Могу передать указатель на одномерный массив, на...

Передача Указателя На Двумерный Массив В Функцию
Как изменить код, чтобы массив объявлялся в main() и передавался в input_strings(). Код: #define MAXLENGTH 129 #define MAXSIZE 20 ...

Как передавать правильно массив в функцию класса
Привет. Помогите разобраться в данной теме. Как передавать правильно массив в функцию класса, который объявлен в main? И почему ругается...

Как правильно передавать в функцию трехмерный массив?
Нужно создать телефонный справочник, с функциями просмотра, добавления и удаления. Не могу понять как правильно передавать в функцию((...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru