1

我最近问了这个问题:为什么我指向整数数组的指针不起作用?

其中一个建议是使用常规变量而不是指向变量的指针。

我过去用 Java 编程过。如果我理解正确,如果您在 Java 中有此代码:

void test(b) {
    b++;
}

void main() {
    int a = 0;
    test(a);
}

然后 a 将保持为 0。但如果我理解正确,在 C 中,如果我有以下代码:

void test(b) {
    b++;
}

int main() {
    int a = 0;
    test(a);
    return 0;
}

然后a变成1?

4

4 回答 4

4

不,在 c 中传递一个值会复制该值,并且原始变量不会更改。

现在,您可以传递该变量的地址值,然后在函数中查看传递的地址指向的位置,并更改该地址处的值,瞧,原始变量已更改。

于 2013-04-01T17:57:37.397 回答
2

不会。在 C 示例中,a仍将保留其原始值。在 C 中,所有参数都按值传递,而在 Java 中,只有原始类型按值传递,所有其他类型均按引用传递。要达到您描述的效果,您的代码应如下所示:

void test(int* b) {
    (*b)++;
}

int main() {
   int a = 0;
   test(&a);
   return 0;
}

在这里,test接受一个指针int,然后取消引用该指针(获取位于指定地址的内存中的值)并将其增加 1。在main()您传递的地址为a.

于 2013-04-01T18:00:54.263 回答
1

等一下。”在 C 中,参数通过值传递给函数,而其他语言可能通过引用传递变量。这意味着接收函数获取值的副本,并且无法直接更改原始变量。对于一个函数改变从另一个函数传递的变量,调用者必须传递它的地址(指向它的指针),然后可以在接收函数中取消引用。有关更多信息,请参阅指针。

于 2013-04-01T18:03:14.147 回答
0

在这两种语言中,变量的传递都是通过复制值来传递的。只是使用C,您可以将内存位置(指针)作为值传递,并有效地通过引用获得传递。

在 Java 中,您可以通过传入引用来做同样的事情(实际上没有内存地址值);但是,java 内置类型不能通过引用传递,因为只有对象可以通过引用来引用。注意数组实际上是java中的对象,所以有些规则在处理数组时必须被解释为对象,即使它们是Java原语的数组。

于 2013-04-01T18:03:21.213 回答