char line[MAX_LINE];
line
- массив символов MAX_LINE длины. Массивы символов, оканчивающиеся нулевым байтом, обычно называются «строками» в C.
char *words[MAX_WORDS];
words
является массивом MAX_WORDS длины указателей на символы (прочитайте это дважды).
fgets(line , MAX_LINE, stdin)
С cppreference fgets :
Считывает не более 1 символа из заданного потока файлов и сохраняет их в массиве символов, на который указывает str. ... Если ошибок не возникает, записывает нулевой символ в позиции сразу после последнего символа, записанного на стр.
fgets
сохраняет строку в массиве line
.
tokenize(line,words,&nwords);
Я не знаю источника этой функции, поэтому она, вероятно, совершает магию и, возможно, записывает в массив words
, назначая указатели на действительные строки для него. Поэтому после него words
массив инициализируется с действительными указателями на строки.
if (strcmp(line,"exit") == 0)
Сравнивает нулевые символы в массиве line
с массивом {'e','x','i','t','\0'}
.
if (strcmp(words[0], "exit") == 0)
Итак, words
- это массив указателей. Берём первый указатель, т.е. words[0]
. Первый указатель, вероятно, указывает на массив символов с нулевым символом в конце, который был инициализирован внутри tokenize
. Так что words[0]
, вероятно, указывает на правильную строку (массив символов). Мы сравниваем эту строку с массивом символов "exit"
.