2015-07-08 2 views
-3

У меня есть два вопроса о указателях void; мы имеем:Вопросы о указателях пустоты

void * foo=malloc(99) 
void **bar=(void**)malloc(99); 

int i=1; 
bar++; 
*bar = foo; 

1.Это эквивалентно приведенному ниже?

bar[i++] = foo; 

Если да, это неожиданное, потому что bar++; перемещает двойной указатель вперед, а не единственный указатель, который отличается от не ничтожных типов.

2.Что это хорошо, чтобы вернуть void** от void * foo();?

Например:

void * foo(){ 
    void ** bar; 
    return bar; 
} 

ответ

4

1.Is вышеуказанное эквивалентно следующему?

bar[i++] = foo; 

Если да, это неожиданно, потому что bar ++; перемещает двойной указатель вперед, а не один указатель, который отличается от типов недействительных .

Это прекрасно, потому что bar является указателем на массив указателей. Известен размер void* (это размер указателя), поэтому вы знаете, где следующий элемент массива void**.

2.Why это нормально, чтобы вернуться void** из void * foo();?

Потому что void* - указатель на что угодно. Указатель на какой-либо указатель - это указатель на что угодно, поэтому void** может быть неявно преобразован в void*.

+1

Но 'bar [i ++]' продвигает тип 'void *' и 'bar ++;' продвигает тип 'void **'. – shinzou

+0

@kuhaku Нет, они этого не делают. 'bar [i ++]' обращается к 'bar' (' void ** ') в позиции' i' и увеличивает 'i'. 'bar ++' продвигает 'bar' одним элементом. –

+0

«Указатель на какой-либо указатель на что-либо является указателем на что угодно» - было бы лучше сказать, что это указатель на * something * (только «void *» является указателем на * что-либо *). –