Преобразование указателей
Есть такой код на С++:
#include <d3dtypes.h>
short info3d_bufferbf[100];
D3DTLVERTEX VertexBuffer[100];
int main(void)
{
short *info3dptrbf = (short*) info3d_bufferbf;
short *info = info3dptrbf;
info[0] = 11;
info[1] = 22;
info[2] = 33;
D3DTLVERTEX* CurrentTLVertex;
CurrentTLVertex=VertexBuffer;
D3DTLVERTEX* pTLV;
pTLV=CurrentTLVertex;
info +=3;
*(D3DTLVERTEX**)info=pTLV;
pTLV->sx = 100.0f;
pTLV->sy = 100.0f;
pTLV->sz = 100.0f;
short * pInfo = info3d_bufferbf;
int Routine1 = *pInfo++;
int Tpage1 = pInfo[0];
int nV = pInfo[1];
D3DTLVERTEX* pV = *((D3DTLVERTEX**)(pInfo+2));
return 0;
}
Код работает отлично. Я не понимаю преобразования:
*(D3DTLVERTEX**)info=pTLV;
Тут один указатель преобразовывается в другой. Почему нельзя написать так:
(D3DTLVERTEX*)info=pTLV;
Объясните пожалуйста указанное преобразование указателей по шагам. Заранее спасибо.
Ответы (2 шт):
Преобразование
(D3DTLVERTEX*)info=pTLV;
не делает info левосторонним значением, и он не может участвовать в присваивании.
а так
*(D3DTLVERTEX**)info=pTLV;
получается левостороннее значение, и присваивание работает.
Запись просто указатель = значение не будет компилироваться. Так как значение (D3DTLVERTEX*)info это временное число, которое вы не можете модифицировать. Оно имеет тип r-value.
Вот пример как вы предлагаете :
// & val = 0x7000
int val ;
// & var = 0x7010
int var ;
// & p = 0x7020
void * p = ( void * ) & val ; // p := 0x7000
// & pp = 0x7030
void * * pp = & p ; // pp := 0x7020
( int * ) pp = & var ; // ошибка : 0x7020 := 0x7010
Цель была изменить именно значение, которое хранилось по заданному указателю. А не сам этот указатель.
Правильнее изменить значение, которое лежит по адресу так :
* ( int * * ) pp = & var ; // ( * 0x7020 ) := 0x7010