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

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

17.02.2012, 14:18. Показов 8990. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru