Если вы объявляете переменную некоторого типа, то вы также можете объявить другую переменную, указывающую на него.
Например:
int a;
int* b = &a;
Таким образом, в сущности, для каждого основного типа, мы также иметь соответствующий тип указателя.
Например: short
и short*
.
Есть два способа «смотреть на» переменной b
(это то, что, вероятно, путает большинство начинающих):
Вы можете рассмотреть b
как переменную типа int*
.
Вы можете рассмотреть *b
как переменную типа int
.
Следовательно, некоторые люди объявят int* b
, тогда как другие объявят int *b
.
Но факт в том, что эти два объявления идентичны (пробелы бессмысленны).
Вы можете использовать либо b
как указатель на целочисленное значение, либо *b
в качестве фактического целочисленного значения.
Вы можете получить (прочитанное) указанное значение: int c = *b
.
И вы можете задать (написать) указанное значение: *b = 5
.
указатель может указывать на любой адрес в памяти, а не только в адрес какой-либо переменной, которую ранее заявленной. Тем не менее, вы должны быть осторожны при использовании указателей, чтобы получить или установить значение, расположенное на указанном адресе памяти.
Например:
int* a = (int*)0x8000000;
Здесь мы имеем переменную a
, указывающие на адреса памяти 0x8000000.
Если этот адрес памяти не отображается в пространстве памяти вашей программы, любая операция чтения или записи с использованием *a
скорее всего приведет к сбою вашей программы из-за нарушения доступа к памяти.
Вы можете смело изменить значение a
, но вы должны быть очень осторожны, изменяя значение *a
.
Первый - это указатель (то есть адрес памяти) - это шестнадцатеричное значение. Другое содержимое этого адреса. –
'*' перед указателем означает «де-ссылку» на указатель или пересечь его. '*' после типа указывает указатель на тип. Указатель - это просто направление где-то в памяти, где хранится данная часть информации. –
'cout << pointerToInteger 'указывает адрес, на который указывает' pointerToInteger'; 'cout << * pointerToInteger' печатает * содержимое *, сохраненное по этому адресу. Подумайте об этом так: 'pointerToInteger' - почтовый ящик перед вашим домом; '* pointerToInteger' - это то, что находится внутри этого почтового ящика. –