2012-11-17 176 views
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; 
} 
+0

尽管事实上你正在改变你传入的内容,但我仍然说使用'const'引用。为什么你希望它在改变它们时使用文字?如果你想以这种方式工作,你需要重新考虑你想要做什么,或者你得到的任何答案显然不起作用,因为这是不可能的,一个很好的理由。 – chris

+0

您不通过引用传递指针...您通过引用传递*引用*。 :)如果你想通过指针传递,那就是它的名字。 – cHao

回答

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

+0

谢谢你非常有帮助 –

+0

Np,你好。 – dreamcrash

2

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

此:

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

副本存储在针对“B”保留用于 “A”保留的存储器位置中的存储器位置中的整数。

此:

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

存储位置 'A' 'B' 的。与此以下它:

*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)

+0

非常感谢,非常清楚的解释 –