Вот что-то я не очень пойму если есть например такая функция:
void allocate (char** array, size_t sz) {
*array = malloc(sz);
}
не тоже ли самое будет если я напишу
void allocate (char* array, size_t sz) {
array = malloc(sz);
}
?
В пользу того что это тоже самое говорит тот факт что разыменование к указателю на указатель дает указатель.
Но примерчик этот обнаружен в книжечке достаточно авторитетной, не думаю что они стали бы всякие небылицы там писать....
Маленький вопросец об указателях.
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Не то же самое. Разница в том, что функция должна вернуть через параметр указатель на выделенный блок памяти. Параметры в С передаются всегда по значению (независимо от их типа, в т.ч. указатели), т.е. при входе в функцию в стеке создается копия передаваемого параметра, при выходе из функции она разрушается. Поэтому и требуется "лишняя" дереференция. В С++ есть альтернативный вариант - ссылки.не тоже ли самое будет если я напишу
спасибо
дошло, хоть и не сразу
а как аналогичный примерчик выглядел бы с использование ссылок?
в голову приходит жуткая конструкция вроде char*& (или char&*)
дошло, хоть и не сразу
а как аналогичный примерчик выглядел бы с использование ссылок?
в голову приходит жуткая конструкция вроде char*& (или char&*)
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Первое
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ещё один маленький вопросец. Если мне нужно завести указатель на массив байтов по адресу: сегмент а000, смещение 0, это будет выглядеть так?
typedef unsigned char scrbuffer [64000];
scrbuffer *screen = (scrbuffer *)0xA000;
И ещё: прочитал в книжке Павловской, как присвоить указателю адрес памяти в явном виде. char *vp = (char *)0xB8000000 Набираю пример. Дословно. Выдаётся ошибка: cannot cast from 'unsigned long' to 'char *'. В чём косяк?
typedef unsigned char scrbuffer [64000];
scrbuffer *screen = (scrbuffer *)0xA000;
И ещё: прочитал в книжке Павловской, как присвоить указателю адрес памяти в явном виде. char *vp = (char *)0xB8000000 Набираю пример. Дословно. Выдаётся ошибка: cannot cast from 'unsigned long' to 'char *'. В чём косяк?
-
- Сообщения: 492
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
Гы-гы... А какого года книжка?
Дело в том, что адрес B800:0000 - это адрес начала видеопамяти для CGA - карточек.
То есть вместо вызова прерывания на "поставить точку" будет засыл в массив. Если карточка -
баба EGA и выше, то скорее всего работать это не будет....
В данной ситуёвине надо воспользоваться FP_SEG/FP_OFF функциями. Я не исключаю, что это
это должно работать в pure-c.
Дело в том, что адрес B800:0000 - это адрес начала видеопамяти для CGA - карточек.
То есть вместо вызова прерывания на "поставить точку" будет засыл в массив. Если карточка -
баба EGA и выше, то скорее всего работать это не будет....
В данной ситуёвине надо воспользоваться FP_SEG/FP_OFF функциями. Я не исключаю, что это
это должно работать в pure-c.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
Попробовал я использовать MK_FP, ошибка: cannot convert 'void *' to 'unsigned char[64000] *'. Может у меня руки не из того места растут? А кстати, что неправильного было в прошлом примере (scrbuffer *screen = (scrbuffer *)0xA000)? А книжка та 2003-го года
-
- Сообщения: 492
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
В любом случае - под 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
Но если очень надо указатель на адрес, только что вот такая
конструкция у меня компильнулась:
Только что увидал - 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
viel spass, DeeJayC
А у меня всё равно не компилится... Может присваивание адреса можно как-нибудь ассемблерной вставкой прописать?
-
- Сообщения: 492
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
А какой компилятор и ось?Дрюль писал(а):А у меня всё равно не компилится... Может присваивание адреса можно как-нибудь ассемблерной вставкой прописать?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC