为什么此程序仅在初始化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 :(得分: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(不是)。 / p>
答案 1 :(得分: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。)