Указатели и функции в C ++ - PullRequest
2 голосов
/ 20 января 2010

Из лекционных записок курса в университете, по «подорожанию»:

void fun(int *ip)

{

*ip =100;

}

вызывается

int n=2;  

int *np;

np = &n; 

fun(np);

изменит значение n на 100.

Когда мы говорим "int * ip", что именно мы имеем в виду? Указатель типа целое число? Если да, то когда мы вызываем fun () с аргументом np в качестве аргумента, не должна ли быть ошибка, поскольку np имеет адрес n, который не является целым числом?

И затем мы меняем значение ip на 100, не значит ли это, что n теперь имеет значение, которое находится в «слоте памяти» с адресом 100? Я уверен, что что-то упустил. :)

Ответы [ 8 ]

7 голосов
/ 20 января 2010

Указатель типа integer?

Нет, указатель на целое число.

когда мы вызываем fun () с аргументом np, разве не должно быть ошибки, поскольку np имеет адрес n, который не является целым числом?

n является целым числом, поэтому проблем нет. &n, np и ip имеют одинаковый тип в вашем коде: int*.

А потом мы меняем значение ip на 100

Нет… мы меняем значение *ip, а не ip. То есть мы меняем значение, которое ip указывает на (которое также иногда называют pointee ).

0 голосов
/ 20 января 2010

Здесь возможна некоторая путаница, потому что и n, и np хранят числа - однако при компиляции компилятор будет использовать числа по-разному;то есть, хотя

n++;

и

np++;

на самом деле являются арифметическими операциями, сгенерированная сборка отличается.Важно помнить, что, в конечном счете, все данные на компьютере являются числами.Они становятся различными типами данных только потому, что мы относимся к ним по-разному.

В частности, что касается вашего примера,

*np = 100;

, вы должны помнить, что * означает разыменование , и эта операция выполняется перед назначением.Это может быть яснее с лишними скобками:

(* (np) ) = 100;

или в другом контексте:

int n = *np;

Теперь, я должен сказать, это согревает мое сердце, когда вы говорите,

мы меняем значение ip на 100, не значит ли это, что n теперь имеет значение, которое находится в «слоте памяти» с адресом 100?поскольку это противоречит тому, что я считаю важным пониманием.Тем не менее, я считаю, что я прав, когда говорю, что вы должны изо всех сил делать такие вещи с указателями:

static_cast<int>(np) = 100;

Это будет делать то, что вы описали, потому что это говориткомпьютер для обработки числа np как другого вида числа;точно так же, как static_cast<char*>(np) будет рассматривать число, на которое указывает np, как символ, а не как целое число.

0 голосов
/ 20 января 2010

ip - указатель, с ip* вы получаете доступ к «слоту памяти», на который он указывает. np также указатель. Используя &n, вы назначаете адрес слота памяти от n до np. Таким образом, при вызове fun() внутри fun() единственный доступный слот памяти - это один из n и, таким образом, n 100 назначается.

0 голосов
/ 20 января 2010

думать о np как о типе int*. Имейте в виду, что для этой цели звездочка и int вместе составляют тип "указатель на тип int" и не разделяются.

0 голосов
/ 20 января 2010

type*, используемый в качестве типа, означает «указатель на этот тип»

обычно используется int *var, но мне нравится записывать его как int* var, поскольку это делает его лучшим отличием от разыменованияуказатель, т.е. *ptr.

, поэтому int* a означает, что указатель на объект типа int, *a означает объект, на который указывает a, а &a означает адрес объекта.а.

0 голосов
/ 20 января 2010

в fun () вы не меняете значение ip на 100, вы меняете место в памяти, на которое указывает ip.

0 голосов
/ 20 января 2010

То, что у вас есть в примере кода, называется передача по указателю .Ваша функция имеет параметр типа , указывающий на целое число .Таким образом, значение, переданное функции, равно адресу переменной n.Функция назначает 100 переменной (т. Е. Ячейке памяти) , указываемой на параметром указателя ip.Звезда * является оператором разыменования в C / C ++.

0 голосов
/ 20 января 2010

Да, когда вы используете int * в качестве типа параметра fun, вы говорите, что он принимает указатель на int.Так как np является указателем на int, передавая его в fun, это нормально.

np и ip указывают на адрес n, поэтому, когда вы присваиваете значение типа *ip = 42, он присваивает значение 42 ячейке памяти, на которую указывает ip - n.

...