Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.02.2012, 14:18     Указатель на двумерный массив и выше #1
Всем привет!Сразу к делу. Я решил по лучше разобраться в указателях и столкнулся с таким вопросом
как реализовать такую вещь именно так как я хочу
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;
}
Я знаю что есть альтернатива с переменными указателями, НО меня интересует именно этот случай как создать указатель на двумерный массив(или выше) имя которого является "указателем - константой". Кто значет тот поймет о чём я говорю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2012, 14:18     Указатель на двумерный массив и выше
Посмотрите здесь:

C++ Указатель на двумерный массив
Указатель на двумерный массив C++
Указатель на двумерный массив C++
указатель на двумерный массив C++
C++ Указатель на двумерный массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.02.2012, 14:26     Указатель на двумерный массив и выше #2
C++
1
int (*tdarr_ptr)[2] = mes;
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.02.2012, 14:28     Указатель на двумерный массив и выше #3
Если требуется константность именно указателя, а не данных, на которые он указывает:
C++
1
2
3
int (* const pp)[2] = mes;
// или
int ** const pp = (int** const) &mes[0];
любое изменение указателя (допустим, инкрементирование) приведет к ошибке компиляции
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.02.2012, 14:38  [ТС]     Указатель на двумерный массив и выше #4
Большое спасибо!
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 14:45     Указатель на двумерный массив и выше #5
Цитата Сообщение от 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] - вот наш "умный" указатель
Миниатюры
Указатель на двумерный массив и выше  
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 14:53     Указатель на двумерный массив и выше #6
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:Ребята поправьтесь в кодах пожалуйста, а то как бы туфта выходит...

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.02.2012, 14:59     Указатель на двумерный массив и выше #7
-=ЮрА=-, вопрос был, как создать указатель на двумерный массив. У вас же не указатель на двумерный массив, а массив указателей (т.е. не единичная сущность "указатель", а набор из таких сущностей). Так что ваш код не соответствует вопросу.
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 15:06     Указатель на двумерный массив и выше #8
silent_1991, а ваш код соответсвует вопросу???ptr[0] в данном случае можно расценивать как указатель на двумерный массив, а вот указанные вами выше коды не позволяет создать универсальный указатель для передачи функцию и мой код яркий тому пример

Не по теме:

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

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.02.2012, 15:08     Указатель на двумерный массив и выше #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот указанные вами выше коды не позволяет создать универсальный указатель для передачи функцию
Смотря, что принимает функция. Если функция принимает указатель на двумерный массив, то ей и надо подсовывать указатель на двумерный массив. Ваша функция Принимает сущность другого типа, вот и вся история. Тем не менее вопрос был о том, как создать указатель на двумерный массивы, а не как создать распрекрасную универсальную функцию.
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 15:16     Указатель на двумерный массив и выше #10
Цитата Сообщение от 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:Я тоже не люблю критику, но иногда её принимаю а не лезу в банку!

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.02.2012, 15:19     Указатель на двумерный массив и выше #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вобще то функции стараются писать
Вообще-то мы тут на конкретные вопросы даём конкретные ответы. Где в вопросе ТСа хоть слово про функцию?

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

Не по теме:

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

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

Том Ардер
Модератор
 Аватар для Том Ардер
3619 / 2238 / 271
Регистрация: 15.06.2009
Сообщений: 3,925
17.02.2012, 15:20     Указатель на двумерный массив и выше #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Запихнуть в функцию так и не вышло
Полезная инфа (указатели и многомерные массивы): http://support.microsoft.com/kb/43703
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 15:28     Указатель на двумерный массив и выше #13
stawerfar, ввиду этих слов
Цитата Сообщение от silent_1991 Посмотреть сообщение
О какой критике речь? О том, что правильный ответ на вопрос "как создать указатель на двумерный массив" вами был воспринят как неправильный? Ну так это не мои проблемы.
Логичен вопрос - для каких целей тебе понадобился указатель на 2-мерный массив?
Для написания универсальной функции для работы как со статическими так и динамическими массивами?Или для чего то ещё?

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

Цитата Сообщение от stawerfar Посмотреть сообщение
имя которого является "указателем - константой"
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
ну правильно, компилятор-то не дурак
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.02.2012, 15:43     Указатель на двумерный массив и выше #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
вот тут популярно объясняется, почему ты получил дулю: http://www.parashift.com/c++-faq-lit...html#faq-18.17
-=ЮрА=-
Заблокирован
Автор FAQ
17.02.2012, 15:51     Указатель на двумерный массив и выше #16
Цитата Сообщение от Nameless One Посмотреть сообщение
вот тут популярно объясняется, почему ты получил дулю:
Nameless One, я и без статьи знаю почему и как что вышло, это уже излишне...
Когда что то не ясно использую пошаговое прохождение и без всяких статей вижу адрес указателя и т.д. так что можешь не утруждаться на поиск ссылок. И да посмотри скрин, чтобы поянл почему замечание по твоему коду сделал...
Миниатюры
Указатель на двумерный массив и выше  
-=ЮрА=-
17.02.2012, 15:56
  #17

Не по теме:

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

fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.02.2012, 16:01     Указатель на двумерный массив и выше #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
о пустом указателе...
Это где ж здесь пустой указатель?
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;
}
Код
0xbff3073c 0xbff3073c 0xbff30744 1
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.02.2012, 16:04     Указатель на двумерный массив и выше #19
лучше посмотри в пошаговом прохождении, что за туфта в твоем коде
моего кода вообще не было, единственный код в топике - твой, который вообще ортогонален тому, что я хотел сказать ТС'у. Нельзя просто так использовать несовместимые типы указателей.
Вот тебе полностью рабочий код:
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);
}
И да, ты хоть читал стартовый пост?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2012, 16:04     Указатель на двумерный массив и выше
Еще ссылки по теме:

C++ указатель на двумерный массив
Указатель на двумерный массив символов C++
C++ Двумерный массив через указатель

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.02.2012, 16:04     Указатель на двумерный массив и выше #20
-=ЮрА=-, не понял, о чём это вы...
http://liveworkspace.org/code/52ccdf...7eddeaff97305e
Yandex
Объявления
17.02.2012, 16:04     Указатель на двумерный массив и выше
Ответ Создать тему
Опции темы

Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru