使用指针传递引用

Pass by Reference with Pointers

本文关键字:引用 指针      更新时间:2023-10-16

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

因为您已经定义了函数来接收指针,但当您调用该函数时,您正试图传递一个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(不是)。

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

此:

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

创建两个整数变量,然后将它们的地址传递到memory设置为"numChange"。顺便说一句,你实际上不需要初始化他们这也起作用:

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

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

(还有一点:我认为变量总是存储在RAM中。这样想是安全的,但现代编译器会尝试为了提高性能,尽可能多地将它们存储在CPU寄存器中原因,需要时将其复制回RAM。)