我知道这段代码:
void incVar(int i){
i++;
}
我们知道这将创建整数的副本,然后增加该值,但不是实际值。
本质上: C 中的方法会在其堆栈框架中创建参数副本,而不是原始变量。
可是:
void incVar(int *i){
(*i)++;
}
应该通过指针取消引用来增加整数的实际值。
但是,为什么 C 只是创建指针*i
的副本而不是?如果这是常规整数的正常行为,那么为什么指针不会发生同样的事情呢?
答案 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(..)
中发生的事情是:
i
,其类型为 pointer-to-int 。&a
。i
是副本,但其值与&a
的值相同,但仍指向相同的整数a
。i
,我引用整数a
。a
,显然位于i
指向的地址。