1

为什么这个程序只在我初始化 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;
}
4

2 回答 2

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(不是)。

于 2012-11-17T01:46:40.650 回答
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 .)

于 2012-11-17T05:27:41.697 回答