回想一下:指针是一个包含内存位置的整数。
此:
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)
尽管事实上你正在改变你传入的内容,但我仍然说使用'const'引用。为什么你希望它在改变它们时使用文字?如果你想以这种方式工作,你需要重新考虑你想要做什么,或者你得到的任何答案显然不起作用,因为这是不可能的,一个很好的理由。 – chris
您不通过引用传递指针...您通过引用传递*引用*。 :)如果你想通过指针传递,那就是它的名字。 – cHao