-1

我想知道调用这样的方法有什么区别:

int x;
mymethod(x); 

mymethod(&x);
4

4 回答 4

2

因为 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;
于 2011-03-06T11:42:37.087 回答
0

mymethod(x)传入整数x作为参数。mymethod(&x)传入内存中的地址x。如果您需要一个指向 int 的指针作为参数,那么您将使用第二个。

于 2011-03-06T11:43:32.450 回答
0

简而言之,当你声明一个指针时,你会在它前面加上一个星号:

int *ptr;

当您传递&x而不是传递时x,您传递的是内存地址。

请阅读这个有用的指针介绍

问候。

于 2011-03-06T11:45:49.783 回答
0

在行中: 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.

于 2011-03-06T11:57:05.307 回答