В чем разница между 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*, а не "по значению" и "по ссылке" будет вполне естественно.

Другие вопросы по тегам