Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1

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

17.02.2012, 14:18. Показов 8954. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!Сразу к делу. Я решил по лучше разобраться в указателях и столкнулся с таким вопросом
как реализовать такую вещь именно так как я хочу
C++
1
2
3
4
5
6
7
8
9
10
int main(void)
{
    
    
    int mes[2][2] = {13,134,11,22};
    int ? pp = mes; //?? 
    
    system("pause");
return 0;
}
Я знаю что есть альтернатива с переменными указателями, НО меня интересует именно этот случай как создать указатель на двумерный массив(или выше) имя которого является "указателем - константой". Кто значет тот поймет о чём я говорю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2012, 14:18
Ответы с готовыми решениями:

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

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

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

27
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.02.2012, 14:26
C++
1
int (*tdarr_ptr)[2] = mes;
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
17.02.2012, 14:28
Если требуется константность именно указателя, а не данных, на которые он указывает:
C++
1
2
3
int (* const pp)[2] = mes;
// или
int ** const pp = (int** const) &mes[0];
любое изменение указателя (допустим, инкрементирование) приведет к ошибке компиляции
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.02.2012, 14:38  [ТС]
Большое спасибо!
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 14:45
Цитата Сообщение от stawerfar Посмотреть сообщение
Я знаю что есть альтернатива с переменными указателями, НО меня интересует именно этот случай как создать указатель на двумерный массив(или выше) имя которого является "указателем - константой". Кто значет тот поймет о чём я говорю.
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>
#include <iomanip>
using namespace std;
 
void outVec(int n, int * vec)
{
    for(int j = 0; j < n; j++)
        cout<<setw(4)<<vec[j];
    cout<<endl;
}
 
void plusOne(int m, int n, int **arr)
{
    int i,j;
    for(i = 0; i < m; i++)
    for(j = 0; j < n; j++)
        arr[i][j] += 1;
}
 
int main()
{
    int mes[2][2] = {13,134,11,22};
    //Ìàññèâ óêàçàòåëåé íà ñòðîêè
    int *ptr[] = {mes[0],mes[1]};
    plusOne(2, 2, &ptr[0]);
    for(int i = 0; i < 2; i++)
        outVec(2, mes[i]);
    system("pause");
    return 0;
}
&ptr[0] - вот наш "умный" указатель
Миниатюры
Указатель на двумерный массив и выше  
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 14:53
Nameless One, твои указатели не работают
Я всего лишь изменил свой рабочий код вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int mes[2][2] = {13,134,11,22};
    //Ìàññèâ óêàçàòåëåé íà ñòðîêè
    //int *ptr[] = {mes[0],mes[1]};
    int ** const pp = (int** const) &mes[0];
 
    plusOne(2, 2, /*&ptr[0]*/pp);
    for(int i = 0; i < 2; i++)
        outVec(2, mes[i]);
    system("pause");
    return 0;
}
И получил дулю от программы...

Добавлено через 3 минуты
silent_1991, тоже самое
я как ни крутил
int (*tdarr_ptr)[2] = mes;
plusOne(2, 2, /*&tdarr_ptr[0]*//*(*tdarr_ptr)*/tdarr_ptr);
Запихнуть в функцию так и не вышло

Добавлено через 1 минуту

Не по теме:

PS:Ребята поправьтесь в кодах пожалуйста, а то как бы туфта выходит...:(

1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.02.2012, 14:59
-=ЮрА=-, вопрос был, как создать указатель на двумерный массив. У вас же не указатель на двумерный массив, а массив указателей (т.е. не единичная сущность "указатель", а набор из таких сущностей). Так что ваш код не соответствует вопросу.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 15:06
silent_1991, а ваш код соответсвует вопросу???ptr[0] в данном случае можно расценивать как указатель на двумерный массив, а вот указанные вами выше коды не позволяет создать универсальный указатель для передачи функцию и мой код яркий тому пример

Не по теме:

Лан я как всегда туп и как всегда не понял вопроса:good:, на этой оптимистической ноте пошёл в другой топик...

1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.02.2012, 15:08
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот указанные вами выше коды не позволяет создать универсальный указатель для передачи функцию
Смотря, что принимает функция. Если функция принимает указатель на двумерный массив, то ей и надо подсовывать указатель на двумерный массив. Ваша функция Принимает сущность другого типа, вот и вся история. Тем не менее вопрос был о том, как создать указатель на двумерный массивы, а не как создать распрекрасную универсальную функцию.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 15:16
Цитата Сообщение от silent_1991 Посмотреть сообщение
то ей и надо подсовывать указатель на двумерный массив.
silent_1991, вобще то функции стараются писать с таким синтаксисом
fun(int m, int n, int **array) (универсальные, на статику и динамику) а производные от них fun(int m, int n int array[][2]) уже наложат отпечаток на алгоритм(с массивом из 3-х столбцов функция работать не будет).
Целью ставил создать объект позволяющий передавать статический массив в функцию вот так
fun(int m, int n, int **array), тогда функциию можно будет писать без оглядки на размерность массива(можно передавать как статические так и динамические массивы)

stawerfar, от себя добавлю если тебе нужен универсальный указатель на статический массив(т.е. для передачи в функцию как динамический), то по хорошему наверное только так
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int *ptr[] = {mes[0],mes[1]};
его и можно создать, а остальное лишь на твоё усмотрение

Не по теме:

PS:Я тоже не люблю критику, но иногда её принимаю а не лезу в банку!

1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.02.2012, 15:19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вобще то функции стараются писать
Вообще-то мы тут на конкретные вопросы даём конкретные ответы. Где в вопросе ТСа хоть слово про функцию?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
критику
О какой критике речь? О том, что правильный ответ на вопрос "как создать указатель на двумерный массив" вами был воспринят как неправильный? Ну так это не мои проблемы.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но иногда её принимаю
Не замечал...

1
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
17.02.2012, 15:20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Запихнуть в функцию так и не вышло
Полезная инфа (указатели и многомерные массивы): http://support.microsoft.com/kb/43703
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 15:28
stawerfar, ввиду этих слов
Цитата Сообщение от silent_1991 Посмотреть сообщение
О какой критике речь? О том, что правильный ответ на вопрос "как создать указатель на двумерный массив" вами был воспринят как неправильный? Ну так это не мои проблемы.
Логичен вопрос - для каких целей тебе понадобился указатель на 2-мерный массив?
Для написания универсальной функции для работы как со статическими так и динамическими массивами?Или для чего то ещё?

Том Ардер, и что ты своим постом хотел сказать
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
17.02.2012, 15:41
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я всего лишь изменил свой рабочий код вот так
где же ты видел, чтобы в рабочем коде функция, которая принимала указатель на указатель, могла принять константный указатель [на указатель]? А у ТС требование константности указателя было указано в первом пОсте:

Цитата Сообщение от stawerfar Посмотреть сообщение
имя которого является "указателем - константой"
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
ну правильно, компилятор-то не дурак
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
17.02.2012, 15:43
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
вот тут популярно объясняется, почему ты получил дулю: http://www.parashift.com/c++-f... #faq-18.17
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.02.2012, 15:51
Цитата Сообщение от Nameless One Посмотреть сообщение
вот тут популярно объясняется, почему ты получил дулю:
Nameless One, я и без статьи знаю почему и как что вышло, это уже излишне...
Когда что то не ясно использую пошаговое прохождение и без всяких статей вижу адрес указателя и т.д. так что можешь не утруждаться на поиск ссылок. И да посмотри скрин, чтобы поянл почему замечание по твоему коду сделал...
Миниатюры
Указатель на двумерный массив и выше  
0
17.02.2012, 15:56

Не по теме:

ушёл из топика...

0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.02.2012, 16:01
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
о пустом указателе...
Это где ж здесь пустой указатель?
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{  
   int data[2][2] = { { 1, 2 }, { 3, 4 } };
   int (*ptr)[2] = data;
   
   printf("%p %p %p %d\n", ptr, ptr[0], ptr[1], ptr[0][0]);
   return 0;
}
Code
1
0xbff3073c 0xbff3073c 0xbff30744 1
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
17.02.2012, 16:04
лучше посмотри в пошаговом прохождении, что за туфта в твоем коде
моего кода вообще не было, единственный код в топике - твой, который вообще ортогонален тому, что я хотел сказать ТС'у. Нельзя просто так использовать несовместимые типы указателей.
Вот тебе полностью рабочий код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
void addOneAndPrint(int (* const p)[2], size_t n, size_t m)
{
    int i, j;
 
    for(i = 0; i < n; ++i, putchar('\n'))
    for(j = 0; j < m; ++j)
        p[i][j] += 1, printf("%-4d", p[i][j]);
}
 
int main(void)
{
    int foo[2][2] = {{1,2}, {3,4}};
        
    int (* const pfoo)[2] = foo;
        
    addOneAndPrint(pfoo, 2, 2);
        
    exit(0);
}
И да, ты хоть читал стартовый пост?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.02.2012, 16:04
-=ЮрА=-, не понял, о чём это вы...
http://liveworkspace.org/code/... eaff97305e
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.02.2012, 16:04
Помогаю со студенческими работами здесь

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

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

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

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

Указатель на двумерный массив
#include &lt;iostream&gt; using namespace std; int a = { 0 }, b = { 1 }; void foo(int val) { int *arr; if (val == 1) arr =...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru