Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
#1

Обобщенный указатель типа void - C++

08.01.2012, 02:28. Просмотров 4659. Ответов 18
Метки нет (Все метки)

В приложенной картинке рассказывается о динамическом распределении памяти в С. Сказано, что функция malloc() возвращает указатель типа void. Что это вообще значит?! Функции void не могут возвращать значения! А тут ещё какой-то обобщенный указатель! О_о
Миниатюры
Обобщенный указатель типа void  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 02:28     Обобщенный указатель типа void
Посмотрите здесь:

Указатель типа void c++ - C++
Haпример указатель типа void*ptr char *p void *ptr="abs"; p=((char *)ptr);Так указатель неопределённого типа, присваивается к...

Указатель типа void - C++
Добрый день. enum Type { Double, Int, Float }; void func(int k,enum Type t,...) { void *pv; pv = (...); ... }

Обобщенный указатель на шаблонный класс - C++
Здравствуйте. Имеется класс template <typename T> class TListManager { protected: TList <T> *head; TList <T> *tail; ...

Указатель на void - C++
Как можно сделать универсальную функцию, которая принимает указатель на неопределенный тип, увеличивает значение на которое указывает этот...

Указатель void на структуру - C++
Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на void. Как преобразовать структуру в...

Чем плохой указатель на void? - C++
Здравствуйте! Недавно прочитал статью на хабре http://habrahabr.ru/post/102930/ Сабж - архитектура игрового двигла, а именно менеджер...

Арифметика указателей (указатель на void*) - C++
У меня есть указатель на void*, который я получил с помощью void *beginPointer = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);Мне...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
08.01.2012, 02:32     Обобщенный указатель типа void #2
Это указатель без привязки к типу. Просто хранит некий адрес
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 02:46  [ТС]     Обобщенный указатель типа void #3
Зачем же его тогда void-ом обозвали? Это же сбивает с толку. Сделали бы int к примеру...
И смысл тогда от того, что указатели объявляют с типом? Ну помимо случая с указателем на начало массива, когда от типа зависит куда он будет указывать при p++.
Jupiter
08.01.2012, 02:47
  #4

Не по теме:

Цитата Сообщение от Tamoren Посмотреть сообщение
Сделали бы int к примеру...
а указатель на int как обозвать? Tamoren-ом?

Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 03:16  [ТС]     Обобщенный указатель типа void #5
Просто сказать - указатель. Ну это в любом случае перебор.
А вот int лучше, чем void. А потом его уже приводить к нужному типу. Потому что писать void перед функцией, которая возвращает указатель... Тип void же для того, чтобы показать, что функция ничего не возвращает.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.01.2012, 03:22     Обобщенный указатель типа void #6
товарищ void и void* это разные вещи путать их ну никак нельзя
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 03:43  [ТС]     Обобщенный указатель типа void #7
Все, я понял. Не с той стороны копал: "ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей". Это всё объясняет. Всем спасибо!
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 04:49     Обобщенный указатель типа void #8
Цитата Сообщение от Tamoren Посмотреть сообщение
Зачем же его тогда void-ом обозвали? Это же сбивает с толку. Сделали бы int к примеру...
ага, выделяем мы память под массив символов char, a malloc нам раз и указатель на int

Цитата Сообщение от Tamoren Посмотреть сообщение
Все, я понял. Не с той стороны копал: "ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей". Это всё объясняет. Всем спасибо!
Какраз таки не поняли, void это не тип, это указание что тип не известен, malloc возвращает void с условием что Вы уже сами знаете тип и укажете его, например
C
1
char*c=(char*)malloc(sizeof(char)*10);
Здесь мы указываем что полученный указатель на void мы приводим к типу указатель на char и потом уже присваиваем нашей c.
Jupiter
08.01.2012, 04:50
  #9

Не по теме:

Цитата Сообщение от Gepar Посмотреть сообщение
malloc возвращает void
лучше допиши слово указатель, а то кто не так поймет и холивар затеит

Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 04:57  [ТС]     Обобщенный указатель типа void #10
По сути то возвращает адрес, которому по барабану, в каком указатель виде представить...

Цитата Сообщение от Gepar Посмотреть сообщение
ага, выделяем мы память под массив символов char, a malloc нам раз и указатель на int
В данном ислучае использовать приведение. смысл был в том, что нужно дать функции тип по умолчанию, а остальные приведением. можно char по умолчанию дать, к тому же они наверно чаще используются.

Цитата Сообщение от Gepar Посмотреть сообщение
Какраз таки не поняли, void это не тип, это указание что тип не известен, malloc возвращает void с условием что Вы уже сами знаете тип и укажете его
Да понял я Повикипедил, там все подробно описано: откуда, почему и зачем. Просто я не учел, что void был создан не для того, чтобы показать, что функция ничего не возвращает.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 05:03     Обобщенный указатель типа void #11
Цитата Сообщение от Tamoren Посмотреть сообщение
Просто я не учел, что void был создан не для того, чтобы показать, что функция ничего не возвращает.
Нет, там он используется только потому что нельзя оставлять пустое место если функция ничего не возвращает так как по старому стандарту си (точнее фактически когда не было этого самого стандарта) если у функции не написано какой тип она возвращает то это int, там же можно было писать
C
1
2
3
4
5
main()
{
...
return 0;
}
так как нужно было оставить эту совместимость то и используется void в таких случаях. Но если у вас функция возаращает void* (указатель на void то Вы должны понимать что это не "указатель на ничто == ничто").
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.01.2012, 12:11     Обобщенный указатель типа void #12
Цитата Сообщение от Tamoren Посмотреть сообщение
Все, я понял. Не с той стороны копал: "ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей". Это всё объясняет. Всем спасибо!
Ну ты дал! А как же на чистых сях описывались функции, не возвращающие значений (то есть форм ально функции, а фактически процедуры)?
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
11.01.2012, 00:42  [ТС]     Обобщенный указатель типа void #13
Википедия
kisssko
31 / 31 / 2
Регистрация: 19.12.2011
Сообщений: 72
11.01.2012, 01:39     Обобщенный указатель типа void #14
Цитата Сообщение от Tamoren Посмотреть сообщение
Зачем же его тогда void-ом обозвали? Это же сбивает с толку. Сделали бы int к примеру...
И смысл тогда от того, что указатели объявляют с типом? Ну помимо случая с указателем на начало массива, когда от типа зависит куда он будет указывать при p++.
Совершенно не сбивает с толку. Этот тип зовётся void* (указатель на тип void).
Не стоит путать void* с void - это разные типы.

Добавлено через 17 минут
Цитата Сообщение от Tamoren Посмотреть сообщение
А вот int лучше, чем void. А потом его уже приводить к нужному типу.
И кстати, на 64-битных платформах указатели 64-битные, а int так и остался 32-битный.
Поэтому очень не рекомендуется хранить указатели в int.
Для хранения указателей в целочисленных типах нужно использовать типы size_t, либо ptrdiff_t.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 02:17     Обобщенный указатель типа void
Еще ссылки по теме:

Привести указатель на класс к указателю на void - C++
Хай #pragma once #include "list.h"; #include "Print.h"; class Robot { public:

указатель на void в иерархии классов. можно ли так делать? - C++
здравствуйте! Такое дело: мне нужно написать иерархию классов для работы с таблицей. базовый класс - это просто таблица, а производный...

Как узнать тип, переданный через указатель на void? - C++
есть функция, принимает LPVOID, нужно узнать как тип переменной был передан, и сколько занимает в байтах, подскажите как это сделать

Допустима ли запись вида void method(T *& member)? (ссылка на указатель) - C++
Есть структура struct FamilyMember { int age; std::string name; FamilyMember(int _age, std::string _name): ...

Функции типа void - C++
Добрый вечер, у меня есть проблема, которую я не могу решить. Есть функция типа void. Суть этой функции в том, чтобы печетать некие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
11.01.2012, 02:17     Обобщенный указатель типа void #15
void поддерживается только в среде VS?
Yandex
Объявления
11.01.2012, 02:17     Обобщенный указатель типа void
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru