我想知道调用这样的方法有什么区别:
int x;
mymethod(x);
和
mymethod(&x);
因为 C 总是按值调用,如果你希望函数能够改变函数内部的 x,你必须传递 x 的地址。
mymethod(x);
将通过 x,例如如果 x 为 2,您也可以编写mymethod(2)
mymethod(&x)
将地址传递给 x。现在该方法可以更改存储在该地址的值,因此在函数完成后,x 的实际值可能已更改。
现在您还可以声明一个指针:
int* y; //y is now a pointer to a memory address
y = &x; //y now points to the memory address of x;
*y = 5; will set the "value found at the address y" to 5, thus will set x to 5;
mymethod(x)
传入整数x
作为参数。mymethod(&x)
传入内存中的地址x
。如果您需要一个指向 int 的指针作为参数,那么您将使用第二个。
在行中: int x;
你分配一块“int”大小的内存。对于这个解释,我们假设 int 的大小是 4 个字节(它可能不是 4 个字节)。
所以在“int x;”行之后 内存中有 4 个字节分配给“x”。“x”的值在这 4 个字节内:例如,如果 x=4,那么它将在内存中看起来像这样:[0, 0, 0, 4] 或二进制 [0000000, 00000000, 00000000, 00000010] . (在现实生活中它也可能是 [4, 0, 0, 0],但我不会深入探讨)。
所以 x 的VALUE是 4。
但是假设我想要“x”的地址,它被放置在内存中。这就是运算符“&”发挥作用的地方,使用此运算符我请求x的地址。
因此,如果 [0, 0, 0, 4] 从内存中的位置“0x12341234”开始,&x 将返回该位置 (0x12341234)。现在,如果我想将地址存储在一个变量中,这个变量的类型不是“int”,而是指向被标记为“int*”的 int 地址的东西。
所以:
诠释 x = 4; // <-- 分配 4 个字节的内存并用数字 4 填充它的值。 int* pointer_to_x = &x; // <-- pointer_to_x 指向 x 在内存中所在的地址。
如果有这样声明的方法: void mymethod(int x) 比我们传递 x 的值,所以该方法被称为 mymethod(x)。
如果有这样声明的方法: void mymethod(int* x) 比我们传递一个 POINTER 到 x 的地址,所以该方法被称为 mymethod(&x)。
It is really the tip of the iceberg, and I really tried to keep it simple as I could, so if you have further questions, just ask!
There are also terms called "by value" and "by reference" but you still need to understand better the difference between int and int* and than "by value" and "by reference" will be quite natural.