Преобразование указателей

Есть такой код на С++:

#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 шт):

Автор решения: Mikhailo

Преобразование

(D3DTLVERTEX*)info=pTLV;

не делает info левосторонним значением, и он не может участвовать в присваивании.

а так

*(D3DTLVERTEX**)info=pTLV;

получается левостороннее значение, и присваивание работает.

→ Ссылка
Автор решения: AlexGlebe

Запись просто указатель = значение не будет компилироваться. Так как значение (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
→ Ссылка