2013-10-12 2 views
1

Это может быть очевидно, но может ли указатель void безопасно указывать на другой указатель? то есть точка типа Int *Может ли указатель пустоты безопасно указывать на указатель-указатель?

int i = 5; 
int *ip = &i; 
void *vp = &ip; 

int *nip = *(int **)vp; 
int ni = *nip; // == 5? 

EDIT: К сожалению, может быть, я не будучи ясно, я хотел бы знать, если указатель недействительным может указывать на область памяти, которая имеет тип другого указателя; без пустоты **. just void *

+0

'int * nip = * vp;' должно быть 'int * nip = vp;' – ouah

+0

Нет, это был бы супер очевидный вопрос, спасибо за ваш вклад. – jayjay

+0

'int * nip = * vp;' в этом случае ответ очевиден: вы не можете разыменовать 'void *'. период. – ouah

ответ

5

Да, вы можете преобразовать любой указатель объекта в void * и вернуться к исходному типу указателя без потери информации.

Из первоисточника:

(C99, 6.3.2.3p1) «Указатель к мочеиспусканию может быть преобразован в или из указателя на любой неполный или объект типа Указатель на любой неполный или объект. тип может быть преобразован в указатель на void и обратно, результат сравнивается с исходным указателем ».

+0

да, но может ли он «указывать» на другой указатель? – jayjay

+1

Он может указывать на что угодно; нет ничего особенного в указателе. – Dolda2000

+2

@jayjay 'void *' может указывать на любой объект: поэтому 'int' или' int * 'или даже' int ** '. – ouah

2

Да, это может указывать на любой тип объекта . Вы не можете на самом деле dereference указатель на пустоту, поскольку компилятор не знает «реального» типа за ним. Но указывающий аспект - это хорошо.

От C11 6.3.2.3 Pointers /1:

Указатель на недействительной может быть превращена в или из указателя на любого типа объекта. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат сравнивается с исходным указателем.


1/ «Тип объекта» не включает в себя функции, правила для преобразования указателей на функции являются немного более строгими.

+4

* Да, он может указывать на любой тип * Он может указывать на любой * тип объекта *. Не гарантируется наличие типов указателей функций. – ouah

+0

Отправлено в отношении отбрасывания типов 'const'. Если вы этого не заметили, это вопрос C, а не C++. – paxdiablo

Смежные вопросы