Здесь возможна некоторая путаница, потому что и 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, как символ, а не как целое число.