C中的地址副本?

时间:2017-01-17 06:53:32

标签: c

我知道这段代码:

void incVar(int i){
  i++; 
}

我们知道这将创建整数的副本,然后增加该值,但不是实际值。

本质上: C 中的方法会在其堆栈框架中创建参数副本,而不是原始变量。

可是:

 void incVar(int *i){
      (*i)++; 
    }

应该通过指针取消引用来增加整数的实际值

但是,为什么 C 只是创建指针*i的副本而不是?如果这是常规整数的正常行为,那么为什么指针不会发生同样的事情呢?

3 个答案:

答案 0 :(得分:8)

指针也一样。 C中的所有变量都是按值传递的,甚至是指针。

将存储在函数外部的指针中的地址复制到其参数中。

但您可以使用该地址引用一个可以在任何地方分配的变量。所以在下面的代码中:

int j = 0;
incVar(&j);

incVar收到副本 j的地址。但它可以使用该地址直接读取或修改j(in)。

答案 1 :(得分:1)

事实上,与指针一样,值与值相同。只需确保正确理解语法即可。您将整数Ã – string çöntäining nön äsçii çhäräçtérs couldn’t A – string containing non ascii characters couldn’t 按副本传递给*i,但您要通过副本传递incVar类型的指针i。无论您将指针复制到地址的频率如何,它始终指向相同的地址。因此,您的第二个int*示例中的i指向调用者获取地址的整数。因此,通过derefencing指针的副本(在incVar中),您将访问调用者的整数。

答案 2 :(得分:0)

最好将int *i;视为类型为 pointer-to-int 的名为i的变量,而不是名为*i的指针。

在你的例子中:

 void incVar(int *i) {
      (*i)++; 
    }

我们可能在主函数中使用它:

int a = 5;
incVar(&a); //After this line, a is now 6.

incVar(..)中发生的事情是:

  1. 创建了一个变量i,其类型为 pointer-to-int
  2. 它包含&a
  3. 副本
  4. 虽然i是副本,但其值与&a的值相同,但仍指向相同的整数a
  5. 因此,通过取消引用i,我引用整数a
  6. 增加整数a,显然位于i指向的地址。