我想知道调用一个方法之间的区别是什么:
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 *ptr;
当你传递&x
而不是x
时,你传递的是内存地址。
请阅读this useful introduction to the pointers。
问候。
在行中: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的值是4。
但是让我说我想要“x”的地址,它放在内存中。这是运算符“&”发挥作用的地方,使用此运算符我请求x的地址。
因此如果[0,0,0,4]从内存中的“0x12341234”位置开始,&x将返回该值(0x12341234)。现在,如果我想将地址存储在变量中,则此变量的类型不是“int”,而是指向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)。
这真的是冰山一角,我真的尽量保持简单,所以如果你还有其他问题,那就问问吧!
还有一些称为“按值”和“按引用”的术语,但你仍然需要更好地理解int和int *之间的区别,而不是“按值”和“通过引用”将是非常自然的。