Что означает оператор ** в C? - PullRequest
1 голос
/ 08 марта 2010

Имеет ли ** какое-либо особое значение в C?

Как это:

static intparse_one (int argc, char **argv)
{
    cmd_line       *slot;
    int             value;
    Flag_name       flag_name;
    int         i;

printf("argv %s\n",argv);
printf("argv[0] %c\n",**argv);

Если это так, линия

**argv

имеет смысл? Программа, которую я пытаюсь запустить, задыхается от этого. Если я пытаюсь распечатать его, я получаю ошибку сегментации .

Первый printf печатает строку в порядке. Второй printf завершается неудачей.

Вот что я получаю для вывода (первая строка верна):

argv -aps_instance1001-aps_ato0-aps_ipc_debug3

Segementation Fault (core dumped)

Ответы [ 7 ]

9 голосов
/ 08 марта 2010

«Имеет ли ** какое-то особое значение в C?»

Нет, это просто две разыменования .

char **argv

означает: argv разыменовывается два раза char. Другими словами argv - это указатель на указатель на char.


То же самое для:

«Если это так, имеет ли смысл строка: **argv

В декларации говорится, что **argv - это char. Во время выполнения argv будет разыменовано два раза; значение char, на которое указывает argv, указатель на указатель на char, указывает на

2 голосов
/ 08 марта 2010

** это просто два *.

Что касается segfault, посмотрите на вашу строку printf("argv %s\n",argv);. printf ожидает char *, а не char **, и поэтому он смотрит на массив указателей, а не на массив символов. printf пытается напечатать все на argv в виде строки символов, пока не встретит ноль, и, вероятно, выходит за пределы, прежде чем найдет один.

argv - это char **, который является указателем на указатель или, в данном случае, массивом указателей. Не печатайте это непосредственно, потому что у этого нет никакого внешнего значения. (Конечно, вы можете напечатать значение указателя, если хотите его увидеть.)

*argv или argv[0] - это char *, который является указателем на char, который в этом случае является первой строкой в ​​argv.

**argv - это char, который в данном случае является первым символом первой строки в argv.

1 голос
/ 08 марта 2010

char **argv совпадает с char *argv[].

Здесь argv - вектор аргумента.

1 голос
/ 08 марта 2010

номер

Каждый * вводит уровень косвенности. В этом контексте это означает, что argv является указателем на указатель. На самом деле это не так, технически вы можете видеть это массив указателей - его можно объявить как char * argv[].

Очевидно, под "нет" я имею в виду, что ** не является особенным сам по себе. Или это особенное, но ни много, ни мало * или ***.

1 голос
/ 08 марта 2010

Да.

char ** argv

- это то же самое, что и

char * argv []

0 голосов
/ 08 марта 2010

Хотя строка "**" имеет четко определенное значение, я думаю, что ответ на вопрос "**" - это не один оператор, а два "*" в строке.

Это в отличие от Fortran , где "**" является одиночным токеном и действует как оператор возведения в степень.

Таким образом, значение хорошо охвачено Мартином Беккетом , но на самом деле это не "оператор".

0 голосов
/ 08 марта 2010

Разве это не указатель на указатель? Я думаю, что ** перед параметром argv имеет тот же эффект, что и ref в C #, если вы знаете C #.

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