Что означает положение звездочки в построении функций C? - PullRequest
3 голосов
/ 08 марта 2019

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

Что происходит, когда:

Я пишу звездочку после типа возврата?

char* my_function(){...}

Что если записать звездочку перед именем функции?

char *my_function(){...}

Что такое звездочка между ними?

char * my_function(){...}

Что означает 2 звездочка?

char **my_function(){...}

И да, следующий код компилируется:

char* * **my_function(){...}

ИЛИ ... они все одно и то же?

Ответы [ 4 ]

7 голосов
/ 08 марта 2019

char* my_function(){...} определяет функцию, возвращающую указатель на символ .

char *my_function(){...} определяет функцию, возвращающую указатель на символ . То же, что и выше - другой стиль.

char * my_function(){...} определяет функцию, возвращающую указатель на символ . То же, что и выше - другой стиль.

Что означает 2 звездочки? -> указатель на указатель.

char **my_function(){...} определяет функцию, возвращающую указатель на указатель на символ . Не так, как указано выше - другой тип возврата.

char* * **my_function()(){...} определяет функцию, возвращающую указатель на указатель на указатель на указатель на символ . Не так, как указано выше - другой тип возврата.

5 голосов
/ 08 марта 2019

Пока звездочки лежат между char и my_function, интервал не имеет значения.

Во всех случаях они являются частью возвращаемого типа функции.

char* означает, что возвращаемым типом является указатель на char.

char** означает, что возвращаемым типом является указатель на указатель на char.

и т. Д.

4 голосов
/ 08 марта 2019

В объявлении T *p, T* p и T * p все анализируются как T (*p) - * является частью объявления, а не спецификатором типа.Итак, все первые три объявления функций объявляют my_function, чтобы вернуть указатель на char.

T **p, объявляют p как указатель на указатель на T.Да, возможна множественная косвенность, и вы можете иметь указатели на указатели, указатели на указатели на указатели и т. Д.

Основные правила:

T *p;        // p is a pointer to T
T *p[N];     // p is an array of pointer to T
T (*p)[N];   // p is a pointer to an array of T
T *f();      // f is a function returning a pointer to T
T (*f)();    // f is a pointer to a function returning T
T const *p;  // p points to a const T
const T *p;  // same as above
T * const p; // p is a const pointer to T
2 голосов
/ 08 марта 2019

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

char* - указатель на char, char** - указатель на char*.

Интервал не имеет значения.

Я предлагаю вам более подробно взглянуть на указатели, что они из себя представляют и как их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...