2015-03-10 3 views
3

Я понимаю, что разница между char * argv [] и char ** argv (как объясняется, например, в this question).Что такое char ** argv [] в C++?

Но какой тип char ** argv []? Указатель на указатель на указатель символов? И что это будет, когда используется для передачи аргументов в программу?

Для записи типа происходит в следующем объявлении библиотеки C++ Я пытаюсь интерфейс для Python:

/** Initialize the Stage library. Stage will parse the argument 
    array looking for parameters in the conventional way. */ 
    void Init(int* argc, char** argv[]); 
+8

Надеюсь, что это опечатка –

+1

То же, что и 'char *** argv' в этом контексте FWIW, но я угадываю из' main', 'argv' точек в другом месте после того, как вы передадите' & argv'. Однако сигнатура функции нечетна, поскольку '[]' передает, что аргумент должен быть массивом, и я не могу представить, что еще дать ему, кроме одного элемента 'argv' – chris

+1

FYI: http: // www. cdecl.org/ переводит его в _declare argv как массив указателя на указатель на char_ – Motti

ответ

4

Если main определения main(int argc, char * argv[]) и вы хотите отправить argv с помощью указателя, вы будете сделать Init(&argc, &argv). И соответствующий параметр может быть char ** argv[].

+0

@Deduplicator просто любопытно, хорошо ли определено поведение для изменения 'argc' и' argv'? – vsoftco

+0

@ i486: Конечно! Сначала я должен был взглянуть на главный. Это точно так же, как вы сказали. – stefano

+0

@ Дедупликатор: этап - это роботизированное симуляционное окружение, которое может включать в себя несколько роботизированных контроллеров. Функция Init передает аргументы командной строки всем контроллерам в симуляции. – stefano

2

Я предполагаю, что эта функция Init внесет изменения в argc и argv, которые были получены main, поэтому для них нужны указатели.

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

1

char** argv[] является массивом char**, IOW массив указателей на указатели на char с, или более вероятно, массив указателей на символьные строки с завершающим нулевым, например:

char *str1 = "..."; 
char *str2 = "...."; 

char** argv[2]; 
argv[0] = &str1; 
argv[1] = &str2; 

Однако, если argv является исходя из самого main(), то char** опечатка, должно быть char* вместо:

char* argv[] 

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

Смежные вопросы