-1

我正在编写一个函数来从着色器代码文件中加载文本。我偶然发现了关于指针的一些奇怪的东西,我不知道为什么。

我有一个名为 Load 的函数。在此函数中,我将从文件流中获取的文本复制到输出变量中。

static void Load(const GLchar* source_path,  GLchar* output,GLint& count )
{
    string code;

    // loading logic here
    code= vShaderStream.str(); // copying the string from the stream
    count = code.length(); 
    output = new GLchar[count];
    std::size_t length = code.copy(output, count, 0);
    output[length]= '\0';
}

负载是这样调用的:

for (size_t i = 0; i < d_n_fragment; i++)
{
    Load(d_fragment_source_path, d_fragment_code[i], d_fragment_string_count[i]);
} 

其中d_fragment_code是 Glchar** 的双指针,它已经初始化。调用 Load 函数后,指针d_fragment_code[i]不包含文本。我试图将 Load 函数的签名更改为:

static void Load(const GLchar* source_path,  GLchar*& output,GLint& count )

从而通过引用传递指针。它有效,在调用函数后d_fragment_code正确保存了从文件加载的文本,但我不明白为什么要通过引用传递指针。

我认为只传递一个指针就足以改变它的内容。我很困惑,你能解释一下吗?

4

3 回答 3

4

如果您必须修改指针而不是指针指向的对象,则应该通过引用传递指针。

使用双指针也是类似的情况。

这是一篇更详细的文章: http:
//www.codeproject.com/Articles/4894/Pointer-to-Pointer-and-Reference-to-Pointer

于 2015-01-30T13:15:54.177 回答
3
output = new GLchar[count];

这改变了什么output指向。如果您确定output已经指向足够大小的缓冲区,请删除此行。

于 2015-01-30T13:04:34.377 回答
2

我认为只传递一个指针就足以改变它的内容。

传递一个指针就足以改变被指针(指向的东西)的内容。太好了,它与传递引用的效果基本相同。

但你没有那样做。您想更改指针本身。

考虑一下,如果您想将一个对象传递给一个函数,以便该函数更改原始对象。让我们称对象的类型为 T,并假设它有一个mutate以某种方式改变它的成员函数(这样我们就不必给出一个真实世界的例子作为T改变):

void foo(T& handle)
{
   handle.mutate();
}

void bar(T* handle)
{
   handle->mutate();
}

int main()
{
   T obj;
   foo(obj);
   bar(&obj);
}

两者都foo完成bar同样的事情,分别使用引用和指针。

现在我们可以通过将各种类型交换为T. 您正在考虑的场景是通过指针传递一些非指针对象来对其进行变异:

void bar(int* handle)
{
   handle->mutate();
}

int main()
{
   int obj;
   bar(&obj);
}

但是您实际所处的情况要求T它自己是一个指针,并且使用foo而不是bar. 这是可以理解的,这是令人困惑的!

void foo(GLint*& handle)
{
   handle.mutate();
}

int main()
{
   GLint* obj;
   foo(obj);
}

如果它有帮助,你也可以写:

void bar(GLint** handle)
{
   handle->mutate();
}

int main()
{
   GLint* obj;
   bar(&obj);
}

这实际上是等效的。

(免责声明:我没有obj在任何这些示例中初始化。你会想要的。)

于 2015-01-30T13:01:42.377 回答