О массивах и указателях - PullRequest
       1

О массивах и указателях

0 голосов
/ 29 декабря 2011

Краткий вопрос, касающийся в основном понимания того, как указатели работают с массивами в этом примере:

char *lineptr[MAXLENGTH]

Теперь я понимаю, что это то же самое, что и char **lineptr, поскольку массив сам по себе является указателем.

Мой вопрос заключается в том, как он работает в различных его формах / состояниях, на которые нет ссылок, таких как:

lineptr
*lineptr
**lineptr
*lineptr[]

В каждом из этих состояний, что происходит, что делает / работает каждое состояние вкод?

Любая помощь очень ценится!

Ответы [ 4 ]

5 голосов
/ 29 декабря 2011

Теперь я понимаю, что это то же самое, что и char **lineptr, поскольку массив сам по себе является указателем.

Нет, массив не совпадает с указателем. См. C FAQ: http://c -faq.com / aryptr / index.html .

lineptr

Это сам массив. В большинстве случаев он распадается в указатель на свой первый элемент (т.е. &lineptr[0]). Таким образом, его тип: int *[MAXLENGTH] или int **.

*lineptr

Это разыменовывает указатель на первый элемент, поэтому это значение первого элемента (т. Е. Оно совпадает с lineptr[0]). Его тип int *.

**lineptr

Это разыменовывает первые элементы (т.е. это то же самое, что и *lineptr[0]). Его тип int.

*lineptr[]

Не думаю, что это правильный синтаксис (в данном контексте).

1 голос
/ 29 декабря 2011

За исключением случаев, когда это операнд оператора sizeof или унарный & или строковый литерал, используемый для инициализации другого массива в объявлении, выражение типа "массив N-элементов из T" будет заменено («decay to») выражением типа «указатель на T», а значением выражения будет адрес первого элемента.

Выражение lineptr имеет тип "MAXLENGTH -элементный массив char *". В большинстве случаев он будет заменен выражением типа char **. Вот удобная таблица, показывающая все возможности:

Expression      Type                  Decays to  Evaluates to
----------      ----                  ---------  ------------
  lineptr       char *[MAXLENGTH]     char **    address of first element in array
 &lineptr       char *(*)[MAXLENGTH]  n/a        address of array
 *lineptr       char *                n/a        value of first element
  lineptr[i]    char *                n/a        value of i'th element 
 &lineptr[i]    char **               n/a        address of i'th element 
 *lineptr[i]    char                  n/a        value of character pointed to by i'th element
**lineptr       char                  n/a        value of character pointed to by zero'th element

Обратите внимание, что lineptr и &lineptr оценивают одно и то же значение (адрес массива совпадает с адресом его первого элемента), но их типы различаются (char ** против char *(*)[MAXLENGTH]).

1 голос
/ 29 декабря 2011

Хорошо, обо всем по порядку.

Массивы не являются указателями.Они просто разлагаются на указатели, когда это необходимо.Думайте о массиве как о указателе, который уже имеет некоторые данные, неправильно размещенные / распределенные к нему.


lineptr: это просто возвращает массив.Не много, чтобы сказать.

*lineptr: Это то же самое, что и доступ к первому местоположению вашего массива.*lineptr = lineptr[0].Это просто случается, чтобы вернуть char *

**lineptr: это доступ к первому расположению массива, а затем разыменование этого местоположения.**lineptr = *(lineptr[0]).Поскольку ваш массив содержит char*, он вернет char, хранящийся в char * в слоте 0 массива.

*lineptr[i]: Это отменяет char*, хранящийся в i.Таким образом, char, на который указывает lineptr[i], возвращается.

1 голос
/ 29 декабря 2011

lineptr - это / массив / сам.

*lineptr - первый элемент массива, символ *

**lineptr - это символ, на который указывает первый элемент массива

*lineptr[N] - это символ, на который указывает N-й элемент массива

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