为什么在C ++中我需要通过引用传递指针来更改指向的内容?

时间:2015-01-30 13:00:14

标签: c++ pointers double-pointer

我正在编写一个从着色器代码文件加载文本的函数。我偶然发现了有关指针的奇怪内容,我无法弄清楚原因。

我有一个名为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 后,它可以正确保存从文件加载的文本,但我不明白为什么指针要通过引用传递。

我认为仅传递指针就足以改变其内容。我很困惑,你能否对它有所了解?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

output = new GLchar[count];

这会更改output指向的内容。如果您确定output已指向足够大小的缓冲区,请删除此行。

答案 2 :(得分:2)

  

我认为仅传递指针就足以改变其内容。

传递指针足以改变指针对象(指向的东西)的内容。这很好,它与传递引用的效果基本相同。

但你不是那样做的。你想改变指针本身。

考虑一下,如果你想将一个对象传递给一个函数,使得该函数改变了原始对象。让我们调用对象的类型T,让我们假装它有一个成员函数mutate以某种方式改变它(这样我们就不必像T那样给出一个真实的例子) :

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

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

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

foobar分别使用引用和指针完成相同的操作。

现在我们可以通过交换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。您需要。)