用指针传递参考

时间:2012-11-17 01:40:27

标签: c++ pointers reference

为什么此程序仅在初始化a和b时有效。 我想在没有初始化a和b的情况下传递它,例如:

numChange(10,15);

这可能吗?

#include <iostream>
using namespace std;
void numChange(int *x,int *y)
{
     *x = 99;
     *y = 77;
}

int main()
{
    numChange(10,15);
    //int a=10;
    //int b=15;
    //numChange(&a,&b);
    cout<<a<<" , "<<b<<endl;

    return 0;
}

2 个答案:

答案 0 :(得分:3)

因为你已经定义了接收指针的函数,但是当你调用那个函数时,你试图传递一个int。

编译器期待内存地址,并且您正在尝试传递常量。

没有意义,你正试图做10 = 99之类的事情; 15 = 77;?

numChange(10,15);
    //int a=10;
    //int b=15;

似乎你跳了a = 10 = 99而b = 15 = 77;

如果这是可能的,这意味着我永远不会(在调用numChange(10,15);之后)使变量实际上具有值10,因为10“指向”99(不是)。 / p>

答案 1 :(得分:2)

召回:指针是一个包含内存中位置的整数。

此:

int a, b;
...
a = b;

将存储在为'b'保留的存储单元中的整数复制到 为'a'保留的内存位置。

此:

int *a, b;
...
a = &b;

将'b'的位置存储在'a'中。跟着它:

*a = 42;

将42存储在存储在'a'中的内存位置,即 变量'b'。

现在,让我们来看看你的代码。这样:

void numChange(int *x,int *y)

告诉编译器将使用两个调用'numChange' 指针 - 即内存地址。这部分:

 *x = 99;
 *y = 77;
然后

将两个整数存储在'x'和'y'中给出的位置

致电时:

numChange(10,15);

参数是整数而不是内存位置。不过 引擎盖,内存位置也是整数,所以编译器转换 指针的参数。实际上,它正在这样做:

numChange((int *)10, (int*)15);

(当发生这种情况时应该发出警告,因为它几乎从不 一个好主意,但这样做。)

基本上,你对'numChange'的调用告诉它有整数 存储器地址10和15的变量,'numChange'继续 并在这些内存位置存储整数。因为不是 在这些位置的变量(我们知道),实际上是这个代码 在某处覆盖其他一些数据。

同时,这段代码:

int a=10;
int b=15;
numChange(&a,&b);

创建两个整数变量,然后传递其地址 记忆到'numChange'。顺便说一下,你实际上并不需要初始化 他们。这也有效:

int a, b;
numChange(&a,&b);

重要的是创建变量(和编译器 为他们留出RAM),然后将他们的位置传递给他们 'numChange'。

(一旁:我将变量视为始终存储在RAM中。 以这种方式思考它们是安全的,但现代编译器会尝试 尽可能将它们存储在CPU寄存器中以提高性能 原因,需要时将它们复制回RAM。)