Простое пояснение C-указателя - PullRequest
3 голосов
/ 05 января 2011

Я только начал работать с указателями в C, и я зациклен на чем-то простом. Я хочу убедиться, что правильно понимаю.

Скажи, что у меня есть что-то вроде этого:

int *buff;

Из того, что я прочитал,

*buff refers to the value that buff is currently pointing to
&buff refers to the address

Но я застрял на следующем:

Что означает просто «бафф»? Относится ли это к расположению & buff в памяти, которое указывает на местоположение значения * buff?

Спасибо большое! : 3

-jtsan

Ответы [ 5 ]

10 голосов
/ 05 января 2011

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  ...
4 голосов
/ 05 января 2011

С учетом деклараций:

int value = 13;
int *buff = &value;

Ты прав:

*buff == 13

потому что buff указывает на value и содержит 13.

Вы, вероятно, неправильно понимаете, что означает &buff; это адрес переменной buff, поэтому тип &buff равен int **, указатель на целое число. Напротив, &value является адресом переменной value; он имеет тип int * (поэтому для инициализации не требовалось никакого приведения - он имеет правильный тип для хранения в buff).

Обычный buff - это int * или указатель на целое число. Содержит адрес переменной value.

3 голосов
/ 05 января 2011

бафф был объявлен как "указатель на int".использование * buff - это все равно, что сказать «на что указывает бафф», то есть значение int.использование & buff подобно произнесению «адреса баффа», который является адресом указателя, указывающего на int (еще один уровень косвенности).

3 голосов
/ 05 января 2011

* бафф относится к значению, на которое бафф в данный момент указывает

Да

& бафф относится к адресу

Нет .По крайней мере, если вы думаете, о чем я думаю.&buff не не относится к адресу, на который он указывает в данный момент, &buff относится к адресу в памяти, в которой находится сам buff.

Что означает «бафф»?

buff относится к тому, что вы думали &buff, то есть к тому адресу, на который указывает buff,Значение указателя - это адрес того, на что он указывает.

Вот несколько примеров, которые могут вам помочь:

  1. int *buff; - объявить указатель наint , который в данный момент нигде не указывает
  2. int foo; buff = &foo; - указывать положительный эффект на адрес foo
  3. *buff = 5; - изменить содержимое того, что положительный эффект указывает на (foo) на 5
  4. int **buff_ptr = &buff; - объявить указатель на указатель на int и указать его по адресу buff
1 голос
/ 05 января 2011

Вы правы в том, что *buff относится к местоположению, на которое указывает buff, но &buff относится к адресу из buff самого . Адрес (&) данных, на которые указывает buff (*), равен *&buff или чаще всего buff.

Удачи. Указатели довольно хитры, но, похоже, вы на правильном пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...