Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在函数中修改指针? 作为C++初学者,我首先想到的是函数使用一个参数的副本,例如,如果我们执行这个: void add (double x){ x=x+3; } int main(){ double x=2 ; add(x) ; }_C++_Function_Dynamic Memory Allocation - Fatal编程技术网

为什么在函数中修改指针? 作为C++初学者,我首先想到的是函数使用一个参数的副本,例如,如果我们执行这个: void add (double x){ x=x+3; } int main(){ double x=2 ; add(x) ; }

为什么在函数中修改指针? 作为C++初学者,我首先想到的是函数使用一个参数的副本,例如,如果我们执行这个: void add (double x){ x=x+3; } int main(){ double x=2 ; add(x) ; },c++,function,dynamic-memory-allocation,C++,Function,Dynamic Memory Allocation,那么x实际上等于2,而不是5。后来,通过学习指针,我发现: void fill (int *t){ for (int j=0, j<10, j++){ t[j]=j; } int main(){ int* p; p = new int[10]; fill(p); } void fill(int*t){ 对于(int j=0,j在第一个示例中,您使用的是普通变量。当将普通变量传递给函数时,就像这样,函数创建自己的变量副本(它的值与传递时的值相同,但它被复制到内存中的不同位置)。这

那么x实际上等于2,而不是5。后来,通过学习指针,我发现:

void fill (int *t){
  for (int j=0, j<10, j++){
  t[j]=j;
}

int main(){
int* p;
p = new int[10];
fill(p);
}
void fill(int*t){

对于(int j=0,j在第一个示例中,您使用的是普通变量。当将普通变量传递给函数时,就像这样,函数创建自己的变量副本(它的值与传递时的值相同,但它被复制到内存中的不同位置)。这是标准行为

在第二个示例中,您使用的是指针:我们可以说它指向内存中存储值的位置

1) 如果您想节省内存,但需要在不同的函数中使用相同的值->主要应用于比double更大的对象,如示例中的数组

2) 如果需要在不同的函数中更改变量/数组/对象的值

但请注意,在第二个函数中,您仍然创建了副本,但不是值,而是指针。因此,基本上,“新”指针是不同的对象,但它指向内存中的同一位置,因此在访问值(您正在使用[j])时,您正在编辑内存中的同一位置


这不是一个容易理解的概念,尤其是用更多的数组,但是希望这有点帮助。你可以在教程或C++文档中学习更多的东西,例如,这是一个很好的例子:

< p>与第一个函数不一样的原因是因为你是通过值传递指针的。这意味着如果你修改了实际的点。r、 例如,通过赋值,那么它在函数中只会处于该状态。指针指向的值仍然是原始值,这将被修改,因为两个复制的指针都指向相同的原始值(不要忘记形式
a[i]
的符号相当于
*(a+i)
,它执行解引用并修改指向的值,而不是指针本身)

下面是一个说明这一点的小示例(不考虑内存泄漏):

#包括
int测试(int*x)
{
int*y=新的int{10};
x=y;

std::cout参数本身是复制的,但是当复制指针时,复制的指针仍然指向原始对象,这意味着当您修改所指向的对象时,您将看到在取消引用原始指针时所反映的更改。这是创建可以修改现有对象的函数的常用方法(尽管在现代C++中,使用原始指针是不明智的,但引用或STL智能指针是首选的),你仍然通过值传递指针。你不修改参数<代码> T <代码>本身,你修改它指向的数据。如果你给不同的变量不同的名字,这种事情就更清楚了。“
x
实际上等于2”并不准确;
main
中的
x
应该是2,但是
add
中的
x
应该是5(在它消失之前)。指针不是数组。当你谈论“
p
包含的内容时"您必须非常小心:
p
是一个指针,它包含一个内存地址;仅此而已。您的函数
fill
将该内存地址视为数组中的第一个元素;这没关系,因为代码就是这样做的,但是
p
不包含数组;它指向数组。若要获取
添加
,请进行修改
x
,将参数定义为引用(即别名):
void add(double&y){y=y+3;}
#include <iostream>

int test(int* x)
{
    int* y = new int{10};
    x = y;
    std::cout << "Inside function: " << *x << "\n";
}

int main()
{
    int* t = new int{5};
    std::cout << "Before function: " << *t << "\n";
    test(t);
    std::cout << "After function: " << *t << "\n";
}