Назначение указателя в C++. (Указатель на указатель на указатель находится на LHS)
IDirect3DSurface9 *var = NULL;
IDirect3DSurface9 *** ret;
Я хочу присвоить значение, разыменованное var, в переменную, на которую указывает ret.
Я сделал следующее:
(*(*(ret[0]))) = var;
Я чувствую, что это правильный синтаксис C++. Но почему я получаю ошибку компиляции следующим образом:
ошибка C2679: двоичный файл '=': не найден оператор, который принимает правый операнд типа "IDirect3DSurface9 *" (или это недопустимое преобразование).
Какой правильный синтаксис?
3 ответа
Вы сняли ссылку на указатель 3 раза. Однажды, когда вы рассматривали это как массив и использовали индекс [0]
, а затем еще два раза с *
оператор. Для того, чтобы быть совместимым с var
Вы должны отменить ссылку только дважды.
Чтобы быть более явным, давайте разберем это:
ret
имеет типIDirect3DSurface9***
,ret[0]
имеет типIDirect3DSurface9**
,*(ret[0])
имеет типIDirect3DSurface9*
,*(*(ret[0]))
имеет типIDirect3DSurface9
,
И ясно, что *(*(ret[0]))
не совместим с var
который имеет тип IDirect3DSurface9*
,
Что касается того, каким должен быть ваш код, я не могу сказать наверняка, но вам нужно будет удалить один уровень косвенности.
Каждый *
а также []
отнимает один уровень косвенности. Так в вашем коде
(*(*(ret[0]))) = var;
левая сторона имеет тип IDirect3DSurface9
в то время как правая сторона имеет тип IDirect3DSurface9 *
, Два типа различаются, поэтому вы получаете ошибку компилятора. Вы должны исправить это, удалив (хотя бы один) *
от LHS или добавить &
(адрес оператора) в RHS (иметь &var
).
Вы, вероятно, хотите:
(*(*(ret[0]))) = &var;
или же
*(*(*(ret[0]))) = var;