使用指针传递引用
Pass by Reference with Pointers
为什么这个程序只在初始化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。)
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题