int *
означает «указатель на int». Итак, buff
- это указатель на int. Чтобы упростить ситуацию, скажем также:
int x = 5;
int *buff = &x;
x
, целое число, установлено на 5.
&x
означает «адрес х». Таким образом, buff
содержит адрес x
. Ради аргумента предположим, что x
хранится по адресу памяти 0x1000. Так что buff
само по себе также является числом: 0x1000.
*buff
означает «вещь, на которую указывает бафф», в данном случае 5.
&buff
означает «адрес баффа»: адрес, по которому само число buff
хранится в памяти.
Я хотел бы поделиться общей техникой, которую я использовал, чтобы узнать, как работают указатели, когда я только начинал.
Возьмите большой лист миллиметровки и положите его вдоль стола перед собой. Это память вашего компьютера. Каждый блок представляет один байт. Выберите строку и поместите число «100» под полем слева. Это «самый низкий адрес» памяти. (Я выбрал 100 в качестве произвольного числа, которое не равно 0, вы можете выбрать другое.) Пронумеруйте поля в порядке возрастания слева направо.
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Теперь, на данный момент, представьте, что int имеет размер в один байт. Вы восьмибитный компьютер. Запишите свой int a
в одну из коробок. Номер под окном является его адресом. Теперь выберите другое поле, которое будет содержать int *b = &a
. int *b
также является переменной, хранящейся где-то в памяти, и это указатель, содержащий &a
, который произносится как "адрес А".
int a = 5;
int *b = &a;
a b
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Теперь вы можете использовать эту модель для визуальной обработки любых других комбинаций значений и указателей, которые вы видите. Это упрощение (потому что, как скажут педанты языка, указатель не является обязательно адресом, а память не обязательно последовательна, и есть стек, куча, регистры и т. Д. на), но это довольно хорошая аналогия для 99% компьютеров и микроконтроллеров.
Вы также можете расширить модель для настоящих четырехбайтовых int
с ...
int a = 5;
char b = 2;
a a a a b
+---+---+---+---+---+--
| 0 | 0 | 0 | 5 | 2 | ...
+---+---+---+---+---+--
100 101 102 103 104 ...