我最近问过这个问题:Why aren't my pointers to integer arrays working?
其中一个建议是使用常规变量而不是指向变量的指针。
我过去曾用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?
答案 0 :(得分:4)
不,在c传递值时会复制该值,原始变量不会更改。
现在,您可以传递该变量的地址值,然后在您查找传递的地址所指向的函数中,并更改该地址的值,然后更改原始变量。
答案 1 :(得分:2)
没有。在C示例中,a
仍将保留其原始值。在C中,所有参数都按值传递,而在Java中,只有原始类型按值传递,其他所有参数都通过引用传递。为了达到您描述的效果,您的代码应如下所示:
void test(int* b) {
(*b)++;
}
int main() {
int a = 0;
test(&a);
return 0;
}
在这里,test
接受指向int
的指针,然后取消引用(获取指定地址内存中的值)并将其增加1.在main()
中传递地址a
。
答案 2 :(得分:1)
等一下。“在C中,参数按值传递给函数,而其他语言可以通过引用传递变量。这意味着接收函数获取值的副本,并且没有直接的方法来更改原始变量。一个函数来改变从另一个函数传递的变量,调用者必须传递它的地址(指向它的指针),然后可以在接收函数中取消引用它。有关更多信息,请参阅指针。“
答案 3 :(得分:0)
在两种语言中,变量的传递都是通过复制值来实现的。只是使用C,您可以将内存位置(指针)作为值传递,并通过引用有效地传递。
在Java中,您可以通过传入引用来执行相同的操作(实际上没有内存地址值);但是,java内置类型不能通过引用传递,因为只能通过引用引用对象。请注意,数组实际上是java中的对象,因此在处理数组时,必须将某些规则解释为 as objects ,即使它们是Java基元的数组。