2013-03-12 5 views
0

В коде из MSDN, есть это:Почему это работает, даже если функция не вызывается с указателем на указатель в качестве параметра?

HRESULT DemoApp::LoadBitmapFromFile(
    ID2D1RenderTarget *pRenderTarget, 
    IWICImagingFactory *pIWICFactory, 
    PCWSTR uri, 
    UINT destinationWidth, 
    UINT destinationHeight, 
    ID2D1Bitmap **ppBitmap 
    ) 

И это:

hr = LoadBitmapFromFile(
       m_pRenderTarget, 
       m_pWICFactory, 
       L".\\sampleImage.jpg", 
       100, 
       0, 
       &m_pBitmap 
       ); 

Как приходит это работает, когда m_pBitmap фактически является указателем на объект ID2D1Bitmap (ID2D1Bitmap * m_pBitmap) вместо указатель на указатель на объект ID2D1Bitmap?

ответ

4

Обратите внимание, что передаваемый аргумент не является m_pBitmap, но &m_pBitmap.

m_pBitmap Если это ID2D1Bitmap* тогда, когда вы берете адрес его с &, вы получите ID2D1BitMap** - указатель на указатель, так же, как функция ожидает.

2

Взятие адреса указателя делает его указателем на указатель.

int i = 0; 
int *pi = &i // &i is the address of i (or a pointer to the int i) 
&pi // &pi is the address of pi (or a pointer to the pointer to i) 

Таким образом, &m_pBitmap делает указатель на указатель.

0

Передача адреса указателя делает указатель параметра указателем, который является именно типом.