为什么
RECT r;
...
GetClientRect(hwnd,&r);
工作,但
LPRECT r =NULL; //must initialize
...
GetClientRect(hwnd,r);
不起作用?
我认为必须初始化
答案 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作为不使用指针的函数的指示符。)