回想一下:指针是一个包含内存位置的整数。
这:
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 .)