В чем разница между mymethod(i) и mymethod(&i) в C?
Мне было интересно, в чем разница между вызовом метода, как:
int x;
mymethod(x);
а также
mymethod(&x);
4 ответа
Поскольку C всегда выполняет вызов по значению, если вы хотите, чтобы функция могла изменять x внутри самой функции, вы должны передать адрес x.
mymethod(x);
передаст х, например, если х равен 2, вы могли бы также написать mymethod(2)
mymethod(&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;
В нескольких словах, когда вы объявляете указатель, вы предшествуете ему звездочкой:
int *ptr;
Когда вы проходите &x
вместо x
, вы передаете адрес памяти.
Пожалуйста, прочитайте это полезное введение в указатели.
С уважением.
mymethod(x)
проходит в целое число x
в качестве параметра. mymethod(&x)
переходит в адрес в памяти x
, Если вам требуется указатель на in t в качестве аргумента, вы должны использовать второй.
В строке: int x;
Вы выделяете часть памяти размером "int". для этого объяснения мы примем размер int равным 4 байта (это может быть не 4 байта).
поэтому после строки "int x;" в памяти 4 байта, присвоенных "х". значение "x" находится внутри этих 4 байтов: например, если x=4, оно будет выглядеть в памяти следующим образом: [0, 0, 0, 4] или в двоичном формате [0000000, 00000000, 00000000, 00000010], (В реальной жизни это также может быть [4, 0, 0, 0], но я не буду вдаваться в подробности).
Таким образом, значение х составляет 4.
Но допустим, я хочу адрес "х", где он находится в памяти. Это где оператор "&" вступает в игру, с помощью этого оператора я запрашиваю адрес х.
поэтому, если [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), тогда мы передаем VALUE из x, поэтому метод называется mymethod (x).
если есть метод, объявленный так: void mymethod(int* x), тогда мы передаем POINTER по адресу x, поэтому метод называется mymethod(&x).
Это действительно верхушка айсберга, и я действительно старался сделать его максимально простым, поэтому, если у вас есть дополнительные вопросы, просто задавайте!
Существуют также термины, называемые "по значению" и "по ссылке", но вам все же необходимо лучше понять разницу между int и int*, а не "по значению" и "по ссылке" будет вполне естественно.