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

Different passing parameters, different output

本文关键字:输出 参数      更新时间:2023-10-16

如果我们有以下代码,当我们调用函数f时,变量b的内存不会被占用。但是,如果函数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

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

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

指针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[])中,当用f(b);传递int b[] = {1,2,3,4,5};时,可以将数组名称"隐式"转换为指针。问题是函数f()不知道数组的大小。例如,在strlen()等函数中使用此调用,在这些函数中传递null终止字符串。查看Bjarne Stroupstrup第92页的《C++编程语言》第3版。

还有一个基本规则: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=一页&q&f=错误