Маленький вопросец об указателях.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

versus
Сообщения: 45
Зарегистрирован: 12 май 2004, 00:37

Маленький вопросец об указателях.

Сообщение versus » 12 сен 2004, 17:17

Вот что-то я не очень пойму если есть например такая функция:

void allocate (char** array, size_t sz) {
*array = malloc(sz);
}

не тоже ли самое будет если я напишу

void allocate (char* array, size_t sz) {
array = malloc(sz);
}

?

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

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 12 сен 2004, 23:42

не тоже ли самое будет если я напишу
Не то же самое. Разница в том, что функция должна вернуть через параметр указатель на выделенный блок памяти. Параметры в С передаются всегда по значению (независимо от их типа, в т.ч. указатели), т.е. при входе в функцию в стеке создается копия передаваемого параметра, при выходе из функции она разрушается. Поэтому и требуется "лишняя" дереференция. В С++ есть альтернативный вариант - ссылки.

versus
Сообщения: 45
Зарегистрирован: 12 май 2004, 00:37

Сообщение versus » 13 сен 2004, 02:41

спасибо
дошло, хоть и не сразу
а как аналогичный примерчик выглядел бы с использование ссылок?

в голову приходит жуткая конструкция вроде char*& (или char&*)

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сообщение Romeo » 13 сен 2004, 13:30

Первое :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 15:14

Сообщение Дрюль » 17 окт 2004, 19:17

Ещё один маленький вопросец. Если мне нужно завести указатель на массив байтов по адресу: сегмент а000, смещение 0, это будет выглядеть так?

typedef unsigned char scrbuffer [64000];
scrbuffer *screen = (scrbuffer *)0xA000;

И ещё: прочитал в книжке Павловской, как присвоить указателю адрес памяти в явном виде. char *vp = (char *)0xB8000000 Набираю пример. Дословно. Выдаётся ошибка: cannot cast from 'unsigned long' to 'char *'. В чём косяк?

DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Сообщение DeeJayC » 18 окт 2004, 12:30

Гы-гы... А какого года книжка?
Дело в том, что адрес B800:0000 - это адрес начала видеопамяти для CGA - карточек.
То есть вместо вызова прерывания на "поставить точку" будет засыл в массив. Если карточка -
баба EGA и выше, то скорее всего работать это не будет....

В данной ситуёвине надо воспользоваться FP_SEG/FP_OFF функциями. Я не исключаю, что это
это должно работать в pure-c.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC

Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 15:14

Сообщение Дрюль » 18 окт 2004, 15:46

Попробовал я использовать MK_FP, ошибка: cannot convert 'void *' to 'unsigned char[64000] *'. Может у меня руки не из того места растут? А кстати, что неправильного было в прошлом примере (scrbuffer *screen = (scrbuffer *)0xA000)? А книжка та 2003-го года :)

DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Сообщение DeeJayC » 18 окт 2004, 17:01

В любом случае - под win32 это работать не должно....
Только что увидал - In Microsoft C, since the FP_SEG() and FP_OFF() macros dereference the pointer values passed to them, the address of a variable cannot be passed as a parameter. ID: Q47497

Но если очень надо указатель на адрес, только что вот такая
конструкция у меня компильнулась:

Код: Выделить всё

int main( int argc, char **argv ) {

char *p = (char *)0xb8000000L;
return 0;

};
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC

Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 15:14

Сообщение Дрюль » 18 окт 2004, 18:06

А у меня всё равно не компилится... Может присваивание адреса можно как-нибудь ассемблерной вставкой прописать?

DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Сообщение DeeJayC » 18 окт 2004, 18:09

Дрюль писал(а):А у меня всё равно не компилится... Может присваивание адреса можно как-нибудь ассемблерной вставкой прописать?
А какой компилятор и ось?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC

Ответить