指针类型与地址的结果

时间:2015-03-14 04:14:11

标签: c++ pointers

为什么

RECT r;
...
GetClientRect(hwnd,&r);

工作,但

LPRECT r =NULL; //must initialize
...
GetClientRect(hwnd,r);

不起作用?

我认为必须初始化

2 个答案:

答案 0 :(得分:1)

您不必初始化任何内容,但您确实提供了指向现有RECT结构的指针。这就是GetClientRect()将存储返回的客户端矩形坐标的位置。你的LPRECT指针是正确的类型,但它没有指向任何东西。如果你真的想使用指针变量,那么这应该有效:

RECT r;
LPRECT rp = &r;
GetClientRect(hwnd, rp);

答案 1 :(得分:0)

将一般案例应用于您的问题。如果我们谈论RECT *int *Widget *,那无关紧要。

最重要的是,绝对没有办法将未初始化的指针传递给函数,并让该函数为您初始化指针。这在C ++中是不可能的。

举一个简单的传递int*的情况,并尝试在返回时将指针更改为指向int

void foo(int *x)
{
  // put some code here to attempt to initialize the passed-in pointer
}

int main()
{
   int *p = 0;
   foo(p);  // can you make foo turn p into a non-NULL pointer?  You can't.
}

无论您尝试多么努力,foo中都没有可以编写的代码可以更改int*传递的main值。由于指针是通过值传递的,因此无法通过值创建一个在函数返回时被销毁的临时值。

要实际更改指针的值,可以传递对指针的引用,也可以传递指针的指针。但是,函数签名必须更改为int **int *&

所以要明确的是,需要指向T 的指针的函数必须被赋予一个指向某处有效的T的指针(除了指针设置为NULL作为不使用指针的函数的指示符。)