2013-04-22 4 views
2

Привет, я изучаю C и следую учебнику, я прочитал об основах указателей.Интерпретация параметра c указателя

main(int argc, char *argv[]) 

Я действительно не понимаю, как интерпретировать char *argv[].

Я читаю его как CharPointer указывает на массив argv или указатель на chararray из char?

[обновление]

я, может быть, неправильно, однако я думаю, что я запутался, как я знаком с:

Char * ARGV [] // указатель на массив символов Char ARGV [] * // набор значение в pointee

однако я никогда не видел символ * ARGV []

+1

попробовать это [ответ] (http://stackoverflow.com/questions/4176326/arguments-to-main- в-с). Я считаю, что это было задано раньше. –

+1

спасибо за долю! Мне интересно узнать, как C принимает в своих аргументах, если вы можете получить немного больше технических. – laycat

ответ

2

Вы читали заявления C изнутри, имея в виду, что первичные операторы ., -> и [] имеют более высокий приоритет, чем унарные операторы, как *. Таким образом, вы идете влево или вправо, наизнанку, начиная с преимущественно глубоко вложенного и выбирая левый или правый приоритет.

char *argv[]; // argv is an array of pointer to char 
int (*f)(); // f is a pointer to a function returning int 

Вот полный пример, который я только что сделал, что вы можете запустить:

int main(void); 

// g is an array of pointer-to-function with no parameters returning int 
int (*g[])(void) = { 
    main, 
    main 
}; 

// f is an array of pointer-to-array of pointer-to-function returning int 
int (*(*f[2])[2])(void) = { 
    &g, 
    &g, 
}; 


int main(void) { 
    return *f[0][0] == main; 
} 

$ ./a.out 
$ echo $? 
# => 1 
+0

для последнего, я, возможно, ошибаюсь, но я читаю его как return f, который является 2d массивом указателей. указатели пожалуйста * каламбур предназначенный * – laycat

0

вы должны прочитать это как указатель полукокса в массив символов из-за того, как вы определили его, но не забывайте, что нет никакой разницы между какой-либо указателей (char, int, voi d, float и т. д.), они все переменные адреса (некоторые).

+0

Я читаю аргумент слева направо или налево? – laycat

0
char *argv[] 

argv это имя переменной/параметра, это не type, так CharPointer points to argv array не правильный путь, чтобы понять это. Можно сказать, что pointer to int array or double array с int или double являются типами.

char* argv[] на самом деле представляет собой массив из char* (читает массив указателей на char), в основном массив С-строк.

+0

я, могу быть неправильно, однако я думаю, что я запутался, как я знаком с: Char * ARGV [] // указатель на массив символы не Char ARGV [] * // устанавливает значение в pointee однако я не видели символ * argv [] – laycat

+0

@laycat Я никогда не видел char argv [] *, но char * argv [] очень распространен в C++. где вы видели char argv [] *? – taocp

+0

Я ошибся, я видел заявление, подобное pointerX 45 *, чтобы изменить значение в переменной, похоже на char * argv []? – laycat

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