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

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

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

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

char* my_function(){...}

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

char *my_function(){...}

Какая звездочка между ними?

char * my_function(){...}

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

char **my_function(){...}

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

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

ИЛИ... они все одинаковые?


person stramin    schedule 08.03.2019    source источник
comment
Пространство (в основном) не имеет значения в C. char*foo;, char *foo;, char* foo; и char * foo; означают 100% абсолютно одно и то же. Некоторые люди отдают предпочтение тому или иному, возможно, в вашем месте написания кода есть руководство по использованию; Короче говоря: используйте тот, который вам больше нравится, если нет причин использовать другой стиль.   -  person pmg    schedule 08.03.2019
comment
Возможный дубликат C - инициализация указателей, положение звездочки   -  person Richard Chambers    schedule 08.03.2019


Ответы (4)


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

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

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

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

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

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

person chux - Reinstate Monica    schedule 08.03.2019
comment
Было бы грубо не проголосовать за это. Хорошая попытка ;-) - person Bathsheba; 08.03.2019
comment
Моя жена, как музыкант, очень расстраивается, когда кто-то приписывает качество ее игры скрипке. Важно то, как вы используете инструменты! - person Bathsheba; 08.03.2019
comment
@Bathsheba Хорошо, мои благодарности автору Stradivarius инструмента C тарабарщина ↔ English< /i>.;-) - person chux - Reinstate Monica; 08.03.2019
comment
Мне нравится этот ответ, и этот веб-сайт поможет мне понять мои функции, спасибо! - person stramin; 08.03.2019

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

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

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

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

И так далее.

person Bathsheba    schedule 08.03.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
person John Bode    schedule 08.03.2019

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

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

Расстояние не имеет значения.

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

person GBrandt    schedule 08.03.2019
comment
Внутри они одно и то же (длинный указатель) - портит ответ. Вы этого не знаете. - person Bathsheba; 08.03.2019
comment
Разве все указатели не хранятся как 32/64-битные целые числа? Возможно, я неправильно использовал некоторые слова, но я почти уверен, что типы указателей взаимозаменяемы (вы можете преобразовать int* в char*, хотя это может быть немного глупо и пойдет очень неправильно) именно из-за этого. - person GBrandt; 08.03.2019
comment
Не обязательно. Это действительно распространено, но стандарт C этого не определяет. Например, в некоторых системах sizeof(char*) может отличаться от sizeof(double*). Обратите внимание, что текущий урожай чипов Intel использует 48-битные указатели под капотом. - person Bathsheba; 08.03.2019
comment
Правильно, но все указатели (а не память, на которую они указывают) имеют одинаковый размер, верно? Или есть какая-то особая ситуация, когда int* 64-битная, а char*, скажем, 48-битная? Редактировать: О, хорошо, увидел вашу правку. Я не знал об этом, спасибо за информацию \ o. - person GBrandt; 08.03.2019
comment
Я бы все же убрал эту фразу. Люди, вероятно, проголосовали бы за. Я бы отменил свой отрицательный голос. - person Bathsheba; 08.03.2019
comment
все указатели [...] имеют одинаковый размер, верно? не обязательно. Это зависит от реализации. На распространенных x86 или x64 они, наверное, есть, да. - person alk; 08.03.2019
comment
Спасибо. Вот оно -› вот они! - person Bathsheba; 08.03.2019
comment
@GBrandt: в зависимости от платформы указатели могут быть даже не скалярными значениями, а чем-то вроде номера страницы и смещения. Единственное требование состоит в том, что char * и void * имеют одинаковое представление, все указатели типа struct имеют одинаковое представление, все указатели union имеют одинаковое представление и что указатели на знаковые типы имеют такое же представление, как и указатели на соответствующий беззнаковый тип. Да, на x86 они все одинаковые, но есть и странные архитектуры. - person John Bode; 08.03.2019