Изучение книги K&R в CI вызвало несколько вопросов относительно сложных объявлений указателей и отношений указатель-массив.
1) Что именно такое разница между
char amessage[] = "this is a string";
и
char *pmessage
pmessage = "this is a string"
и когда бы вы использовали тот или иной?
Насколько я понимаю, первый выделяет некоторый объем памяти в соответствии с размером строки, а затем сохраняет символы в памяти . Затем, когда вы обращаетесь к amessage [], вы просто получаете прямой доступ к любому char, который ищете. Для второго вы также выделяете память, за исключением того, что вы просто получаете доступ к данным через указатель, когда вам это нужно.Это правильный взгляд на это?
2) В книге говорится, что массивы при передаче в функции обрабатываются так, как если бы вы указали указатель на первый индекс массива и, таким образом, вы управляете массивом, манипулируя указателем, даже если вы все еще можете использовать синтаксис типа [i ]. Верно ли это, если вы где-то только что создали массив и хотите получить к нему доступ, или это правда только в том случае, если вы передаете массив в функцию? Например:
char amessage[]= "hi";
char x = *(amessage + 1); // can I do this?
3) В книге говорится, что использование static отлично подходит для этой конкретной функции:
/* month_name: return name of n-th month */
char *month_name(int n)
{
static char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] : name[n];
}
Я не понимаю, почему именно это хорошее использование static. Это потому, что char * name [] будет удален после возврата из функции, если он не статический (потому что это локальная переменная)? Значит ли это, что в c вы не можете делать что-то вроде:
void testFunction(){
int x = 1;
return x;
}
Без удаления x до использования возвращаемого значения? (Извините, я предполагаю, что это может быть не вопрос указателя, но он был в главе указателя).
4) Есть несколько сложных деклараций вроде
char (*(*x())[])()
Я действительно не понимаю, что происходит. Итак, часть x () означает функцию x, которая возвращает указатель? Но какой тип указателя он возвращает просто "" без int, void или w / e. Или это означает указатель на функцию (но я думал, что это будет похоже на (* x) ())? А затем после того, как вы добавите скобки (потому что я предполагаю, что скобки имеют следующий приоритет) ... что это? Массив функций?
Это связано с моей путаницей с указателями на функции. Если у вас есть что-то вроде
int (*func)()
, это означает указатель на функцию, которая возвращает int, и имя этого указателя - func, но что это означает, когда это похоже на int (* x [3]) ().Я не понимаю, как можно заменить имя указателя на массив.
Спасибо за любую помощь!
Кевин