不同的传递参数,不同的输出

时间:2014-04-17 07:46:09

标签: c++ memory-management parameter-passing

如果我们有以下代码,当我们调用函数b时,不会采用变量f的内存。但是如果函数f具有原型void f(int* &a),那么将分配内存。这怎么可能?

#include <iostream>

using namespace std;


void f(int* a)
{
    a = new int[10];
    a[0] = 55;
}


int main()
{
    int *b;
    f(b);
    return 0;
}

编辑: 那么我有了主要的想法,但为什么还有可能呢?

void f(int a[])
{
     a[0] = 5;
}

int b[] = {1,2,3,4,5};
f(b);

//The value of b[0] will be 5 after the end of function call

2 个答案:

答案 0 :(得分:4)

您正在按值传递指针,因此f有自己的副本。指针af的本地,因此调用者无法访问它(并且分配的内存泄露,BTW)。

当您通过引用传递指针时,a在语义上与传递的指针相同。因此调用者传递的指针指向函数中分配的内存。

答案 1 :(得分:1)

指针int * b;实际上是变量。保存整数的内存地址的变量。例如:

int n;
int* b = &n;     // pointer b is pointing to n

由于指针是变量,您可以按值或按引用传递它。在这里,您可以通过值将其传递给函数。另请查看http://en.cppreference.com/w/cpp/language/pointer

void f(int* &a)的情况下,您通过引用传递int* a变量。它是一个变量(保存int类型变量的内存地址),它不会在代码中初始化为任何值(在main()中)。

在你的第二个代码中。在使用void f(int a[])传递int b[] = {1,2,3,4,5};时,在函数f(b);中,您可以将数组名称“隐式”转换为指针。问题是函数f()不知道数组的大小。例如,您在strlen()等函数中使用此调用,其中传递空终止字符串。查阅“C ++编程语言”,第3版,作者:Bjarne Stroupstrup,第92页。

还有一条基本规则:a[i] <=> (*(a+i))。因此,您的函数void f(int a[])void f(int* a)定义相同。查看Gail Anderson的“导航C ++和面向对象设计”,第40页:http://books.google.gr/books?id=b-NiT6w8FTAC&pg=PA40#v=onepage&q&f=false