我想知道调用类似方法之间的区别是什么:
int x;
mymethod(x);
和
mymethod(&x);
答案 0 :(得分: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;
答案 1 :(得分:0)
mymethod(x)
传入整数x
作为参数。 mymethod(&x)
传递x
内存中的地址。如果你需要一个指向int的指针作为参数,那么你将使用第二个。
答案 2 :(得分:0)
简而言之,当您声明一个指针时,在它前面加一个星号:
int *ptr;
当您传递&x
而不是x
时,您传递的是内存地址。
请阅读this useful introduction to the pointers。
问候。
答案 3 :(得分: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 *”。
所以:
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 *之间的区别,而不是“按值”和“按引用”将是非常自然的。