Указатели и функции указателей

Изучение книги 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]) ().Я не понимаю, как можно заменить имя указателя на массив.

Спасибо за любую помощь!

Кевин

9
задан Matt 22 October 2011 в 04:08
поделиться