В чем разница между использованием указателя в следующих объявлениях? - PullRequest
0 голосов
/ 23 сентября 2018
char *array[size];
char (*aPointer)[size];

Я довольно новичок в C ++, и в настоящее время я работаю над заданием. И я заметил, что есть два разных (может быть?) Использования указателя.Может кто-нибудь сказать, пожалуйста, в чем разница между ними?Спасибо

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

char *array[size] объявляет массив size указателей на char с.

char (*aPointer)[size] объявляет указатель на массив size char с.

Просто для полноты, есть также char *cPointer, который объявляет указатель на char, который может быть первым в массиве.Разница между этим и aPointer семантическая.Расположение памяти будет идентичным.Например, aPointer + 1 вернет указатель, который указывает на местоположение size байт после того, на который указывает aPointer, а cPointer + 1 вернет указатель, который указывает на местоположение на один байт после того, на который указываетcPointer.

Итак, char *array[size] объявляет что-то вроде этого:

 array      +--------+
+------+    | a char |
| a[0] +--->+--------+
+------+
| a[1] +--->+--------+
+------+    | a char |
| ...  |    +--------+
+------+

Конечно, каждый из char, на которые указывает указатель, также может быть первым элементом массива.:

 array      +--------+--------+--------+
+------+    | a char | a char |  ...   |
| a[0] +--->+--------+--------+--------+
+------+
| a[1] +--->+--------+--------+--------+
+------+    | a char | a char |  ...   |
| ...  |    +--------+--------+--------+
+------+

char (*aPointer)[size] объявляет что-то вроде этого:

 aPointer
+--------+    +--------+
|        +--->+ a char |
+--------+    +--------+
              | a char |
              +--------+
              |  ...   |   aPointer + 1
              +--------+    +--------+
                        <---+        |
                            +--------+

char *cPointer может объявлять что-то вроде этого:

 cPointer
+--------+    +--------+
|        +--->+ a char |   cPointer + 1
+--------+    +--------+    +--------+
              | a char +<---+        |
              +--------+    +--------+
              |  ...   |
              +--------+

Обратите внимание, что во всехВ этих примерах указатели изначально ни на что не указывают.Вы должны указать им на что-то самостоятельно.

0 голосов
/ 23 сентября 2018

Первый объявляет массив size указателей на char.Второй объявляет указатель на массив из size элементов типа char.

. Вы можете думать о нем как о операторе [], который связывается сильнее, чем *.Начните читать объявления, подобные этой, в идентификаторе и продолжайте свой путь наружу.В первом случае мы видим идентификатор array.Рядом с ним у нас есть [], а также *.[] связывается сильнее, чем *, поэтому он применяется первым.Таким образом, array является массивом чего-либо.Далее применяется *, поэтому array - это массив указателей на что-либо.Единственное, что осталось, это спецификатор типа char, поэтому array - это массив указателей на char.Второй случай работает аналогично, только там у нас есть круглые скобки, которые заставляют * применить перед [].

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