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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерные массивы и указатели, Как получить адрес элемента массива 
V
    Опции темы
Fazil6
Дата 24.4.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Dov @  24.4.2007,  15:57 Найти цитируемый пост)
Хорошо, тогда скажи мне, что тебя может убедить в том, что имя двумерного массива это указатель на указатель? 


ну, например если бы компиллировалось
Код

int p[3][3];
int** pAr = p; 

то я вынужден был бы признать, что ничего не понимаю и не знаю.

Не представляю что ты можешь привести для доказательства своей теории ибо она ошибочна и доказательства не имеет по определению. В противном случае никто с тобой не спорил бы. Со мной, например, кроме тебя никто не спорит в этой ветке.

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


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



likehood, тогда скажи мне, что же это такое указатель на указатель В твоём понимании, конечно. И какой тип он имеет.
 А заодно скажи мне, что такое указатель,  опять же в твоём понимании. 
Возможно, мы оперируем разными терминами? Я своё определение уже дал.

Добавлено через 3 минуты и 55 секунд
Fazil6, ты тоже скажи, если не трудно, про то, что я спросил у likehood.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
dizzy1984
Дата 24.4.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Daevaorn, Имелось в виду средство для просмотра памяти отладчика vs.
View->Debug Windows->Memory (alt+6).
С его помощью можно было бы посмотреть для случая char arr[10][10]={'a','b','c','d'}.
На место памяти arr. Там должен был бы быть адрес одномерного массива, если бы был прав 
Dov, либо 'a''b''c''d', если бы был прав Fazil6.
PM MAIL   Вверх
Fazil6
Дата 24.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Dov @  24.4.2007,  16:12 Найти цитируемый пост)
 что же это такое указатель на указатель В твоём понимании, конечно. И какой тип он имеет. А заодно скажи мне, что такое указатель,  опять же в твоём понимании. 

меня вполне устраивает тот смысл, который ты вкладываешь в указатели. Меня неустраивает то как ты легко мешаешь указатели, массивы и их имена(которые могут использоваться как указатели). 


Цитата(Dov @  21.4.2007,  13:49 Найти цитируемый пост)
Имя массива а[][] имеет тип int**, т.е. указатель на указатель на int. Мы его приводим к типу int*, т.е. указатель на int. Почему? Потому, что каждый элемент массива pa[3] имеет тип int*, т.е. указатель на int.

это неверно и безграмотно.
PM MAIL   Вверх
bel_nikita
Дата 24.4.2007, 16:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Dov,
Цитата(Dov @ 24.4.2007,  13:28)
Цитату в студию, где я такое говорил? Только перед тем, как её постить, посмотри, что там написано, я тебя очень прошу. 
И я тебя очень прошу: Перед тем, как постить, посмотри, что написал.
Цитата(Dov @ 24.4.2007,  13:28)
Я говорю, что ИМЯ ОДНОМЕРНОГО МАССИВА ЦЕЛЫХ ЧИСЕЛ - ЭТО УКАЗАТЕЛЬ НА ТИП ИНТ( ПОТОМУ ЧТО ХРАНИТ АДРЕС СВОЕГО ПЕРВОГО ЭТЕМЕНТА, КОТОРЫЙ ИМЕЕТ ТИП ИНТ) И ПО ЭТОМУ ИМЕЕТ ТИП ИНТ*(КАК И ВСЕ ОБЫЧНЫЕ УКАЗАТЕЛИ НА ТИП ИНТ).


Итак, вернемся к дискусии.
Хорошо, по-твоему int a[] == int *b, т.е. int a[] - указатель и int*b - указатель. Тогда объясни мне, пожалуйста, почему не прокатывает следующее: 
Код

  int a[10] = {0,1,2,3,4,5,6,7,8,9};
  int *b = new int[10];
  a = b; // Ведь мы просто пытаемся приравнивать "указатель" к указателю.


И еще вернемся к твоему примеру, 
Код
int main()
{
    int p[3][3];
    int** pAr = (int**)p; 
    *(int*)pAr = 6;
    *((int*)pAr + 1) = 8;
    pAr[1][1] = 1; // Ба-Бах!
    cout << *((int*)pAr + 1) << endl;
    return 0;
}

Обясни, пожалуйста, почему происходит Ба-Бах! в 7-ой строке?

З.Ы.: Dov, ты все просишь, чтоб другие отвечали на твои вопросы: что же это такое указатель на указатель; что такое указатель и т.д.
И я тебя прошу: ответь хоть на один мой вопрос, вместо очередного увиливания от ответа и придирки к словам.



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Dov
Дата 24.4.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



bel_nikita, не в обиду тебе, скажу. Во всей этой теме есть всего десяток моих постов. Там есть все ответы на твои вопросы. Там написано, что такое массив и что такое имя массива. Там написано, что имя массива, хоть и указатель, но константный, поэтому и не будет работать твоё присваивание, ну и так далее. Сначала нужно почитать всё внимательно, а потом уже обвинять меня в том, чего я не говорил. А то получается так, читать не хотим, давай рассказывай нам в 1000-й раз одно и тоже. Вы что думаете, мне больше заняться нечем ? 
Убил здесь столько времени и всё заново начинать. Так что ли? Нет уж, надоело.
Повторю ещё раз то, что я сказал раньше.  
Цитата(Dov @  24.4.2007,  11:59 Найти цитируемый пост)
 Если кто не понимает моих объяснений, я не виноват. Я ни кому не навязываю своё мнение. Если кто-то считает, что int[3] или int[333] или int[3][3] это какой-то тип,  к которому можно хоть что-то привести, то ради бога, я не возражаю. Хотелось бы только взглянуть на это приведение.


Всё сказанное в этой теме, моё личное, персональное имхо. всем удачи.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Daevaorn
Дата 24.4.2007, 17:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Dov, жесть. Чушь несешь полную. Почитай перед сном стандарт. Должно вылечить.
PM MAIL WWW   Вверх
Ln78
Дата 24.4.2007, 17:34 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile Ребята, давайте закончим эту дискуссию. Ежу понятно, что главное в последнем посте bel_nikita, это 7-я строчка его примера. Это - единственное, 100%-е и безусловное доказательство того, что приведение в 4-й строчке разумно, если бы оно работало. Тому же ежу понятно, что оно не работает. Dov, безусловно, умнее ежа. Просто сказать, "Извините, господа, #уйню спорол-с" ну не как не получится. И последнее слово он хочет, во что бы то ни стало оставить за собой. Ну и ладно, пусть так и будет

Добавлено через 3 минуты и 13 секунд
Для большей строгости, конечно, лучше
Код

pAr[0][1] = 1; // Ба-Бах!

но это дело не меняет
PM MAIL   Вверх
Fazil6
Дата 24.4.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Dov @  24.4.2007,  17:04 Найти цитируемый пост)
Там есть все ответы на твои вопросы.

на большинство нету. Ни на чьи вопросы, которые неудобны и действительно противоречат твоим теориям ты не ответил...
Своих внятных примеров ты не привел. Если привел, то дай хотябы одну ссылку.
PM MAIL   Вверх
Xenon
Дата 24.4.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bel_nikita @  24.4.2007,  16:37 Найти цитируемый пост)
Хорошо, по-твоему int a[] == int *b, т.е. int a[] - указатель и int*b - указатель.

Если бы было так, то ... 
Код

int arr [] = { 2, 4 , 5 };
int arr2 [][2] = { {2,5}, {4,6} };
int* pTr = arr;
int** pTr2 = 0;
std::cout.setf(std::ios::boolalpha);
std::cout << "int [] == int* - " << ( sizeof(arr)/sizeof(int) == sizeof(pTr)/sizeof(int) ); //Почему не равен размер?
std::cout << "\nint [] == int* - " << (typeid(arr).name() == typeid(pTr).name()); //Почему int [] != int* ?
std::cout << "\nint [][] == int** - " << (typeid(arr2).name() == typeid(pTr2).name()); //Почему int[][] != int** ?

Почему-то всегда выдает false smile

bel_nikita, в твоем примере
Код

int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *b = new int[10];
a = b; // Ведь мы просто пытаемся приравнивать "указатель" к указателю.

можно оправдаться и сказать, что a имеет тип int* const pTr, поэтому присваивание невозможно smile 

Это сообщение отредактировал(а) Xenon - 24.4.2007, 19:21


--------------------
user posted image  
PM MAIL   Вверх
Dov
Дата 24.4.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Fazil6 @  24.4.2007,  16:08 Найти цитируемый пост)
ну, например если бы компиллировалоськод
Код

int p[3][3];
int** pAr = p;
то я вынужден был бы признать, что ничего не понимаю и не знаю.

Ты хоть понимаешь, что ты здесь написал. Ты пытаешься указателю на указатель на инт присвоить адрес двумерного массива. То есть, грубо говоря, вместо int** ты ему подсовываешь int*** и хочешь, что бы это работало. Без приведения это работать не будет. Такому указателю ты можешь присвоить адрес указателя на подмассив массива, но не как не адрес самого массива. Например, ты можешь сделать так:
Код

int p[3][3];
int* pp = p[0]; 
int** pAr = &pp;

Ну, или извращаться и использовать приведение...   

Цитата(Fazil6 @  24.4.2007,  16:08 Найти цитируемый пост)
Со мной, например, кроме тебя никто не спорит в этой ветке.
Fazil6, я тоже с тобой не спорю, я,лишь, высказываю своё мнение.  smile И каждый вправе соглашаться с ним или нет. 
Цитата(Fazil6 @  24.4.2007,  16:36 Найти цитируемый пост)
меня вполне устраивает тот смысл, который ты вкладываешь в указатели.
Хорошо.

Цитата(Fazil6 @  24.4.2007,  16:36 Найти цитируемый пост)
Меня неустраивает то как ты легко мешаешь указатели, массивы и их имена(которые могут использоваться как указатели). 
Твоё право.

Цитата(bel_nikita @  24.4.2007,  16:37 Найти цитируемый пост)
Обясни, пожалуйста, почему происходит Ба-Бах! в 7-ой строке?
А самому что, никак не разобраться?  smile  Посмотри тогда в одном из моих постов на 2-3 странице, как нужно описать указатель на двумерный массив, что бы он работал так, как ты хочешь.  

Цитата(Daevaorn @  24.4.2007,  17:34 Найти цитируемый пост)
Dov, жесть. Чушь несешь полную. Почитай перед сном стандарт. Должно вылечить.
 Слушаюсь, товарищ майор. Разрешите выполнять?

Так, а теперь к делу.
Цитата(Fazil6 @  24.4.2007,  14:52 Найти цитируемый пост)
 мы все тебе говорим, что НЕТ, НЕ ТАК. ЭТО ТВОЕ ЗАБЛУЖДЕНИЕ.

Цитата(Fazil6 @  24.4.2007,  14:52 Найти цитируемый пост)
имя многомерного массива не может использоваться как указатель на указатель

Я сказал, что имя двумерного целочисленного массива имеет тип указатель на указатель на инт. Именно эти мои слова считают здесь чушью и бредом.
Вот мои утверждения:
1. Указатель хранит адрес той ячейки памяти, на которую он указывает.

Если есть такой код:
Код

int var = 5;
int* p = &var; // в р хранится адрес var.
int var1= *p; // var1 == 5
int** pp = &p;// в рр хранится адрес указателя р.
int* p2 = *pp;       // в р2 хранится адрес указателя р.
int var2 = *p2; // var2== 5
int var3 = *(*рр); // var3 == 5 
то это значит.
2. Значением указателя р будет выражение &var, то есть адрес переменной var.
3. Значение по этому адресу можно получить разыменовав указатель р.
4.Доказательством того, что р является указателем служит тот факт, что переменной var2 было присвоено значение 5, которое хранится в ячейке памяти, на которую указывает р, то есть значение переменной var.
5. Разыменование указателя р, то есть получение значения с той ячейки памяти, на которую он указывает это доказательство того, что р это указатель на int. 
6. Поскольку рр содержит адрес указателя р, который является указателем на int, то это доказательтство того, что рр является указателем на указатель на int. 
7. Разыменование указателя рр, то есть получение значения с той ячейки памяти, на которую он указывает это доказательство того, что рр это указатель на указатель на int. 
8. Если значение переменной var3 равно значению var, то это доказательство того, что рр это укзатеть на указатель на int, поскольку через указатель рр мы получили значение ячейки, на которую указывает указатель р, являющийся указателем на int.
9. Таким образом выражение var3 = *(*рр) это доказательство того, что рр это указатель на указатель на int. 

Я хочу знать кто с чем не согласен.
Кто хочет поучаствовать пишите всего два слова, номер утверждения и ответ на него, т.е. да или нет.
Например:
1. нет
2. да 
и т.д.

На сегодня всё, ребятки. Пошёл читать устав, или как там его. А, вспомнил. Стандарт. 
Всем пока. И удачи... в изучении стандарта.  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
JackYF
Дата 25.4.2007, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)
ы хоть понимаешь, что ты здесь написал. Ты пытаешься указателю на указатель на инт присвоить адрес двумерного массива. То есть, грубо говоря, вместо int** ты ему подсовываешь int***


Ну где, где ты там увидел int***?



Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)
А самому что, никак не разобраться?

Мы уже разобрались. Мы просим тебя ответить.



Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)
Я сказал, что имя двумерного целочисленного массива имеет тип указатель на указатель на инт. Именно эти мои слова считают здесь чушью и бредом.


Тебе уже не раз говорили. Еще раз повторяю. Имя массива вообще не имеет законченного типа! Кури стандарт.

Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)
Если есть такой код:

У тебя в коде ни одного массива. Спасибо за работу с указателями. Мы говорим про массивы, не так ли?

Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)
На сегодня всё, ребятки. Пошёл читать устав, или как там его. А, вспомнил. Стандарт. 
Всем пока. И удачи... в изучении стандарта.  smile 

Привыкай. Устав - не устав, но против стандарта не попрешь. MFC - это еще не все.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
apook
Дата 25.4.2007, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Клевый спор smile
Цитата

имя может использоваться КАК указатель

не имя может использоваться как указатель, а указатель может
использоваться в качестве имени, а имя не есть указатель, а
содержит адрес первого элемента массива.

Цитата

В этом случае 1-м элементом многомерного массива будет элемент с индексом[0][0], т.е. первый одиночный символ этого массива.

Dov интересная гипотеза?
Я думаю что 1-м элементом многомерного массива a[3][3] будет обьект с именем a[3], который
в свою очередь содержит адрес элемента с индексом 0.

Цитата

Выкинь ты из головы эти стандарты

Dov я тебя понял smile в предложениях абстрогироваться от стандартов, некий дух ХИППИ
Проникнувшись этим я утверждаю что не существует типа int[3][3] и int*, а есть int и все
остальные значки это прибамбасы! И буду в чем-то прав.
 
Бывает...




Dov Хочется поставить плюсик но ситуация не позволяет, все же ты не прав


Это сообщение отредактировал(а) apook - 25.4.2007, 04:45


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
zkv
Дата 25.4.2007, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(apook @  25.4.2007,  03:54 Найти цитируемый пост)
Dov Хочется поставить плюсик но ситуация не позволяет, все же ты не прав

да, Dov, ты не прав smile. Переливаете из пустого в порожнее, шесть страниц накатали уже, лучше бы программы писали smile
PM MAIL   Вверх
Kipter
Дата 25.4.2007, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да ладно вам, застыдили Dov'a...
Он понимает как это работает и саму суть.... только с теорией плохо....
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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