将传递给函数的指针改为int
Change a pointer to int passed to function
考虑以下代码(基本c++):
#include <cstdio>
void changeNum(int* n) {
int x = 6;
n = &x;
}
int main() {
int num = 5;
changeNum(&num);
printf("num = %dn", num);
}
为什么num
仍然是5?n = &x
不应该是6吗?
退出功能时x
会被删除吗?
退出函数时是否删除x ?
是的。x
为局部变量。那些在函数或块中声明的变量是局部变量。它们只能被该函数或代码块内部的语句使用。
简而言之,这意味着当函数changeNum
结束时,变量x
(在堆栈上分配)将被销毁。
为什么num仍然是5?n = &x不应该是6吗?
让我们分析一下你的奇怪的函数:
void changeNum(int* n) {
int x = 6;
n = &x;
}
你在这里做的是创建一个指针 n
,并为它分配局部变量 x
的地址。
各种评论都是错误的,请注意!这不是未定义行为。指针n
在函数调用时创建(因为是按值传递的,注意指针本身也是按值传递的!),在函数结束时销毁。
实际上你的函数什么也不做:创建一个指针,用调用者提供的地址初始化,然后给它分配另一个地址。
changeNum(&num);
只是说:"创建一个临时指针,按值传递给函数changeNum
(注意按值传递指针!)"。因此,它将创建指针的副本并供函数使用。
我如何实现我想要的?
我建议你好好学习,因为你的代码表明你对指针缺乏经验。
无论如何,正确的行为应该是:
void changeNum(int* n) {
*n = 6
}
将6
赋值给n
所指向的整数!
不,它不像你期望的那样工作。
&
运算符接受变量的地址。你分配的是地址,而不是值。因此,你重写了指针,它是一个局部变量,恰好具有引用另一个对象的语义含义。
有两种解决方法:
方法1 取消对n的引用,这样你就可以给它赋值了。
*n = x;
方法2 重写方法以接受引用,因为它使赋值更直观。
void changeNum(int &n) {
int x = 6;
n = x;
}
int main() {
int n = 5;
changeNum(n);
}
首先,变量'x'在void ChangeNum(*n)
内部声明,当它超出作用域时(当执行退出函数时),x被删除。
void ChangeNum
如下所示:
void changeNum(int &n)
{
int x = 6;
n = x;
}
并像这样调用函数:
changeNum(num);
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 指针问题:从不兼容的类型"int"分配给"int *"
- 运行时错误:引用绑定到类型为"int"的空指针
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 如何将 int 指针转换为浮点指针
- 使用 int 指针的浮点数的位表示形式
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 从类指针到 int 的转换无效
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 为什么当我尝试将char输入到int时,文件指针会卡住
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 双指针 (int**) 和双括号,用于从 2D 数组中获取值
- (C++)通过指针递增,或者:为什么这不起作用?指针->int = 指针->int+1;
- (c++)将int转换为char指针(int是int形式的字符)
- 如何使用指针到指针 (int **) 分配一维数组
- 删除地图中的指针<int,A*>
- 如何将字符串内存地址(如 "7fefe05a8")存储在 C++ 中的指针/int 变量中,以便我可以对其进行位屏蔽?
- 指向包含向量问题的实例类的指针<int>