Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель и многомерный массив, помогите разобраться 
V
    Опции темы
Mikron
Дата 2.9.2011, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Подскажите пожалуйста в чем ошибка

Код

int a[2][3][4]={0,1,2};
int (*p)[3][4];  //объявляется указатель на многомерный массив

p=a;
printf("%d",*(*(*(p+1)+1)+2));

все работает

а если написать так
Код

int a[2][3][4]={0,1,2};
int (*(*p)[3])[4];  //объявляется указатель на массив указателей на массив, так ведь?

p=a;
printf("%d",*(*(*(p+1)+1)+2));

то warning C4047: =: "int (*(*)[3])[4]" отличается по уровням косвенного обращения от "int (*)[3][4]"


PM MAIL   Вверх
rodnover
Дата 2.9.2011, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Код

int **p = a; // Указатель на 2хмерный массив.


Указатель не хранит в себе сведения о количестве элементов. Лучше использовать std::vector

Это сообщение отредактировал(а) rodnover - 2.9.2011, 06:59
PM MAIL   Вверх
xvr
Дата 2.9.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Mikron @  2.9.2011,  02:36 Найти цитируемый пост)
то warning C4047: =: "int (*(*)[3])[4]" отличается по уровням косвенного обращения от "int (*)[3][4]"

Совершенно правильно - отличается. А вы что ожидали?

PM MAIL   Вверх
Mikron
Дата 2.9.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Цитата(rodnover @  2.9.2011,  06:56 Найти цитируемый пост)
Указатель не хранит в себе сведения о количестве элементов. Лучше использовать std::vector

спасибо, я правда только на си тут

Цитата(xvr @  2.9.2011,  11:36 Найти цитируемый пост)
Совершенно правильно - отличается. А вы что ожидали?

я ожидал, что не будет отличаться, потому что думал так:
d[2] - представлено как *p, т.е. один элемент 
d[2][3] - как два *p, т.е. (*p)[2]
d[2][3][4] - как два *p, в каждом из которых есть адрес трех элементов


PM MAIL   Вверх
xvr
Дата 2.9.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Mikron @  2.9.2011,  12:02 Найти цитируемый пост)
я ожидал, что не будет отличаться,

Будет. То, что нечто записывается одинаково, не значит, что и машинный код будет одинаков. Вот пример:
Код

char a[100];
char *b;

a[1];
b[1];
Не смотря на то, что a и b почти везде в программе можно использовать одинаково (и практически забыть о разнице в их определении), транслироваться a[1] и b[1] будет по разному.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.