* Эквивалентно [] в C? - PullRequest
0 голосов
/ 27 мая 2018

Кодировка:

char *argv[]

будет такой же, как:

char **argv

Или:

char *string1;
int  *int_array;

будет точно такой же, как:

char string1[];
int  int_array[];

Ответы [ 4 ]

0 голосов
/ 27 мая 2018

Нет.

Концепция массивов связана с указателями.Фактически, массивы работают очень похоже на указатели на свои первые элементы, и, фактически, массив всегда может быть неявно преобразован в указатель правильного типа.

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

Подробнее см. cplusplus .

0 голосов
/ 27 мая 2018

Нет!Ну, это зависит от контекста, но явно они не одного типа.

* - указатель, тогда как [] - массив.

Указатель - это переменная, значением которой является адрес другой переменной, т. Е. Прямой адрес ячейки памяти.Как и любая переменная или константа, вы должны объявить указатель, прежде чем использовать его для хранения любого адреса переменной.Общая форма объявления переменной указателя: * перед переменным

Где массив - это список объектов.

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

Вот хорошее место, чтобы узнать о них https://www.tutorialspoint.com/cprogramming/c_pointers.htm (также место, где я получил цитату сверху)

0 голосов
/ 27 мая 2018

Существует несколько контекстов, в которых можно использовать [].Это зависит от контекста:

  • Объявление параметра функции - здесь char *argv[] эквивалентно char **argv
  • Объявление массивас инициализацией - здесь int x[] = {1, 2, 3} - это способ получить для вас элементы массива счетчика компиляторов
  • Объявление в области действия блока перевода - здесь int x[] рассматривается как предварительное объявлениес хранилищем в другом месте
  • Последний член struct - это гибкий элемент декларации, который позволяет вам «встраивать» массивы переменныхразмер в struct
  • Составные литералы - (const int []) {1, 2, 3} позволяет создавать массивы "на лету" без объявления специальной переменной.

Как выможно видеть, что * и [] получают одинаковую обработку только в первом контексте;во всех других контекстах лечение отличается.

0 голосов
/ 27 мая 2018

Абсолютно нет.Один - указатель, другой - массив.

Однако, когда дело доходит до параметров, char *param эквивалентен, например, char param[] или char param[16].

From C11 черновик N1570 , §6.7.6.3 / 7 :

Объявление параметра в виде "массива типа" должно быть скорректировано до "квалифицированногоуказатель на тип "[...]

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