|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.01.2013, 19:30 | #11 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Цитата:
А зачем? Может проще понять арифметику указателей? Тогда уж так: int tmp = ((int*) a ) [i]; PS. т.к. писал на скору руку, не предусмотрел случай, если все элементы равны INT_MIN или все элементы кроме одного равны INT_MIN Но это мелочь, добавление одного условия if. |
|
23.01.2013, 19:49 | #12 |
Регистрация: 23.01.2013
Сообщений: 6
|
Я понял что использование такого синтаксиса обязательно, если использовать просто a[i] - неработает. Но смысла непонимаю к сожалению.
и по ключевому слову " *((int*) a + i)" ничего не гуглится |
23.01.2013, 20:10 | #13 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Ну да, это помнится, одна из первых засад, которые надо преодолеть.
Смысл такой (своими словами): Любой массив int a[n], int a[n][m], int a[n][m]..[z] занимает непрерывную область памяти, длина этого блока памяти равна длине в байтах одного элемента помноженного на произведение размерностей. У массива есть первый (нулевой) элемент: a[0][0]; Его адрес int* pa = &a[0][0]; Синтаксис си позволяет обратится к адресу этого нулевого элемента просто int* pa = (int*)a; А раз мы знаем адрес нулевого нулевого элемента, то адреса последующих элементов : pa+1, pa+2, .... Зная адрес любого элемента, можно прочитать значение по этому адресу, разыменовывая указатель: *(pa + 2) PS. Указатель - это переменная содержащая адрес. Последний раз редактировалось EUGY; 23.01.2013 в 20:14. |
23.01.2013, 20:12 | #14 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Адресная арифметика....
адрес 564ADF45 допустим... 32 разрядное число... ... его можно умножать делить вычитать и прибавлять и даже возводить в степень.... обычно прибавляют..... это очень быстрый способ получение содержимого по адресу... ибо оператор ваш.... делает чтото типо pointer+(size*pos). умножение медленно.... для получение содержимого используют *до указателя.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
23.01.2013, 20:23 | #15 |
Регистрация: 23.01.2013
Сообщений: 6
|
Спасибо огромное за объяснения! Я кажется понял:
tmp = *((int*) a + i); Переменной "tmp" присваиваем значение хранящееся по адресу "(int*)a+i" , предварительно разыменовав его, чтобы получить не адрес памяти, а значение которое в нем хранится. Правильно? |
23.01.2013, 20:33 | #16 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Совершенно верно.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Даны числа а1,..,а60. Организовать новый массив из тех чисел, которые входят в последовательность более одного раза (С) | Мишаня@ | Помощь студентам | 0 | 01.12.2012 22:01 |
Максимальное из чисел встречающих в заданной матрице более одного раза | Seo-optimist | Общие вопросы C/C++ | 11 | 25.10.2010 21:44 |
Максимальное из чисел встречающих в заданной матрице более одного раз | Seo-optimist | Помощь студентам | 1 | 25.10.2010 15:13 |
Целочисленный массив. Элементы, которые встречаются более одного раза! | Алина18 | Помощь студентам | 2 | 21.10.2010 08:10 |
поиск максимального элемента, который встречается более одного раза | счастливая | Помощь студентам | 1 | 25.05.2010 16:41 |