Что означает * p, когда ** p уже объявлено?
short **p = (short **)malloc(sizeof(short *));
(лучше записано как)
short **p = malloc (sizeof *p);
Объявляет указатель-на-указатель-на short
p
и выделяет память для указателя знака с помощью malloc
и назначает начальный адрес для этого блока памяти для p
. Смотрите: в C нет необходимости разыгрывать возврат malloc
, это не нужно. См .: Разыгрываю ли я результат mallo c?
*p = malloc(sizeof(short));
(эквивалентно)
p[0] = malloc (sizeof *p[0]);
Выделяет хранилище для одного short
и присваивает начальный адрес для этого блока памяти p[0]
.
**p = 10;
(эквивалентно)
*p[0] = 10;
(или)
p[0][0] = 10;
Назначает значение 10
указателю разыменования *p[0]
(или **p
или p[0][0]
), обновляющее значение по этому адресу памяти до 10
.
printf("**p = %d", **p);
Печатает значение, хранящееся в блоке память, на которую указывает p[0]
(значение, к которому обращаются путем разыменования указателя как *p[0]
или **p
)
Способ сохранить это прямо в вашей голове, это p
- единственный указатель типа указатель на указатель на short
. Есть 2 уровня косвенности (например, указатель на указатель ). Чтобы удалить один уровень косвенности, вы используете унарный оператор *
, например,
*p /* has type pointer-to short */
или [..]
также действует как разыменование, так что:
p[0] /* also has type pointer-to short */
Вы по-прежнему иметь указатель на , поэтому необходимо удалить еще один уровень косвенности, чтобы сослаться на значение, хранящееся в ячейке памяти, на которую указывает указатель. (например, указатель содержит адрес, где short
хранится как его значение). Так что вам нужно:
**p /* has type short */
и
*p[0] /* also has type short */
, как если бы
p[0][0] /* also has type short */
Другой элемент, который нужно держать прямо, - это type control указатель arithmeti c. Таким образом, p++
добавляет 8 байтов к адресу указатель-указатель, так что теперь он указывает на следующий указатель . Если вы делаете short *q = (*p)++;
(или short *q = p[0]++, adds 2-bytes to the address for the pointer-to-short, so
q now points to the next
short in the block of memory beginning at
* p (or
p [0] `). (2-го короткого короткого номера нет, потому что вы выделили только 1 - но вы получите очко)
Дайте мне знать, если у вас есть дополнительные вопросы.