OriginalGriff
Все дело в указателях и в том, что они собой представляют: j
и k
объявляются как переменные" указатель на целое число", что означает, что они не содержат целочисленного значения таким же образом, как i
действительно, они содержат значение, которое говорит вам, где находится фактическое целочисленное значение.
Если вы думаете об автомобилях, "эта машина", "та машина", "моя машина", "ваша машина" - все это "указатель на автомобиль": они не идентифицируют конкретный автомобиль, они идентифицируют его косвенно-вы можете указать пальцем на другой автомобиль и использовать тот же термин "эта машина" или "та машина", или вы можете продать свой текущий Ford и купить Mercedes, и "моя машина" все равно будет работать и идентифицировать текущий автомобиль, который вы хотите водить в магазины.
С указателями на языке Си (и других языках) указатель не содержит целого числа, он содержит адрес в памяти целочисленного значения - все ячейки памяти имеют адрес, который является уникальным числом, сообщающим аппаратному обеспечению, где найти это значение. Доступ к адресу осуществляется путем префикса имени переменной с помощью амперсанда и:
j=&i;
Говорит: "Возьмите адрес переменной
i
и вставил в переменную
j
"
Когда вы печатаете
j
вы получаете номер, который является адресом
i
:
printf(" j=%d",j);
Чтобы получить доступ к самому целочисленному значению, вы должны "разыменовать" указатель с помощью звездного оператора '*':
printf(" *j=%u",*j)
Который использует адрес в
j
чтобы получить доступ к целому числу, на которое он указывает, и выводит значение целочисленного значения.
С этого момента ваш код становится опасным и делает вещи, которые вы не должны делать - особенно если вы хотите, чтобы ваше приложение работало без сбоев, было надежным и ремонтопригодным.
j=j+1;
Увеличение стоимости
j
очевидно, но это увеличивает его на размер того, на что он указывает - целое число. Что означает после этого, что он указывает на что-то другое, чем
i
(на самом деле он указывает на себя в большинстве реализаций C или C++), и это делает его опасным - вы не знаете, что произойдет, если вы его используете. В большинстве случаев он что-то сделает (хотя результаты не всегда предсказуемы), но если вы начнете писать значения, вы очень легко можете вызвать сбой вашей программы.
Делающий это:
j=j+9;
...
k=j+3;
Это еще хуже, потому что он перемещает указатель далеко за пределы памяти, которую должна использовать ваша функция, и это увеличивает вероятность того, что у вас возникнут проблемы.
Не делай этого! Многие ошибки кода связаны с тем, что указатели содержат значения, которые они не должны содержать - unitialized values, outside your memory values, указатели на данные, которые были повторно использованы, - поэтому будьте очень осторожны, чтобы убедиться, что при изменении указателя вы держите его в памяти, к которой он должен получить доступ!