В чем разница между mymethod (i) и mymethod (& i) в C? - PullRequest
0 голосов
/ 06 марта 2011

Мне было интересно, в чем разница между вызовом метода, подобного:

int x;
mymethod(x); 

и

mymethod(&x);

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

Поскольку 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;
0 голосов
/ 06 марта 2011

в строке: 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], но я не буду вдаваться в подробности).

, поэтому VALUE из x равно 4.

Но допустим, я хочу адрес "х", где он находится в памяти. Здесь оператор «&» вступает в игру, используя этот оператор, я запрашиваю адрес из 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 находится в памяти. </p>

если есть метод, объявленный так: void mymethod (int x), чем мы передаем VALUE из x, поэтому метод называется mymethod (x).

если есть метод, объявленный так: void mymethod (int * x), чем мы передаем указатель на адрес x, поэтому метод называется mymethod (& x).

Это действительно верхушка айсберга, и я действительно старался сделать его максимально простым, поэтому, если у вас есть дополнительные вопросы, просто задавайте!

Существуют также термины, называемые «по значению» и «по ссылке», но вам все же необходимо лучше понять разницу между int и int *, а не «по значению» и «по ссылке» будет вполне естественно.

0 голосов
/ 06 марта 2011

В нескольких словах, когда вы объявляете указатель, перед ним стоит звездочка:

int *ptr;

Когда вы передаете &x вместо x, вы передаете адрес памяти.

Пожалуйста, прочитайте это полезное введение в указатели .

С уважением.

0 голосов
/ 06 марта 2011

mymethod(x) передает целое число x в качестве параметра. mymethod(&x) передает адрес в памяти x. Если вам требуется указатель на int в качестве аргумента, вы должны использовать второй.

...