Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Указатель типа 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 = (...); ... }

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

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

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

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

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

Не по теме:

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

4
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 03:16  [ТС] #5
Просто сказать - указатель. Ну это в любом случае перебор.
А вот int лучше, чем void. А потом его уже приводить к нужному типу. Потому что писать void перед функцией, которая возвращает указатель... Тип void же для того, чтобы показать, что функция ничего не возвращает.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.01.2012, 03:22 #6
товарищ void и void* это разные вещи путать их ну никак нельзя
2
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 03:43  [ТС] #7
Все, я понял. Не с той стороны копал: "ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей". Это всё объясняет. Всем спасибо!
0
Gepar
1178 / 534 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
08.01.2012, 04:49 #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.
0
Jupiter
08.01.2012, 04:50
  #9

Не по теме:

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

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

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

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

Добавлено через 17 минут
Цитата Сообщение от Tamoren Посмотреть сообщение
А вот int лучше, чем void. А потом его уже приводить к нужному типу.
И кстати, на 64-битных платформах указатели 64-битные, а int так и остался 32-битный.
Поэтому очень не рекомендуется хранить указатели в int.
Для хранения указателей в целочисленных типах нужно использовать типы size_t, либо ptrdiff_t.
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
11.01.2012, 02:17 #15
void поддерживается только в среде VS?
0
11.01.2012, 02:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 02:17
Привет! Вот еще темы с ответами:

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

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

Преобразовать указатель одного типа в указатель другого. - C++
Всем привет. Мне нужно выполнить задание "Преобразовать указатель одного типа в указатель другого. " Что-то совсем не понимаю. Помогите...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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