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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

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

17.02.2012, 14:18. Просмотров 3071. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2012, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на двумерный массив и выше (C++):

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

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

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

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

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

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

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

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

Не по теме:

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

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

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

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

Не по теме:

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

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

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

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

Цитата Сообщение от stawerfar Посмотреть сообщение
имя которого является "указателем - константой"
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
ну правильно, компилятор-то не дурак
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
17.02.2012, 15:43 #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И получил дулю от программы...
вот тут популярно объясняется, почему ты получил дулю: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17
1
17.02.2012, 15:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2012, 15:43
Привет! Вот еще темы с ответами:

Указатель на двумерный массив указателей - C++
char* err = {{&quot;abc&quot;}, {&quot;def&quot;}}; char ***ptr; ptr = (char ***)err; printf(&quot;%s, %s&quot;, *err + 2, *ptr + 2);Добрый день всем, есть...

Двумерный массив через указатель - C++
как вывести двумерный массив через указатель? с одномерным понятно,а как так же с двумерным сделать? int a = { 1, 2, 3, 4, 5 }; ...

Указатель на двумерный массив символов - C++
Доброго времени суток. Особо не сталкивался со строками, но сейчас возникла необходимость, так же возникли и проблемы. Пытаюсь...

Как обьявить указатель на двумерный массив? - C++
обьясните на примере как обьявить указатель на двумерный массив и потом обращаться к элементам через указатель


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru