Интерпретация объявления переменной-указателя

  1. Что означает int *(cmp)(char*, char*);?

  2. В чем разница между char* ptr1; и char *ptr2;


person Newbie    schedule 09.03.2020    source источник
comment
1) см. здесь 2) просто стиль письма.   -  person Blaze    schedule 09.03.2020
comment
1. int *(cmp)(char*, char*); — это просто int *cmp(char*, char*);: cmp — это функция, которая принимает два аргумента, оба типа char *, и возвращает указатель на int. 2. Без разницы. Это вопрос выбора.   -  person haccks    schedule 09.03.2020
comment
Во втором я предпочитаю char *ptr2;, потому что в char* ptr2, ptr3; ptr3 не указатель, а char ptr3;   -  person Weather Vane    schedule 09.03.2020
comment
Поскольку он называется cmp (сравнить?), я склонен думать, что подпись на самом деле int (*cmp)(char*, char*);, то есть указатель на функцию, которая возвращает int в качестве параметра для функции сравнения в стиле qsort. (как объяснено здесь< /а>). Этот поток может быть полезен, если вы хотите узнать, как написать такую ​​функцию.   -  person Groo    schedule 09.03.2020
comment
@WeatherVane Просто не пишите несколько объявлений в одной строке - это общеизвестная угроза безопасности. Не только для указателей; Я также видел такие вещи, как int a,b,c = 0;, когда программист хотел установить все элементы равными нулю, а не только c.   -  person Lundin    schedule 09.03.2020
comment
@Groo Хорошее замечание, хотя в таком случае это должно было быть int (*cmp)(const void*, const void*).   -  person Lundin    schedule 09.03.2020


Ответы (1)


это

int *(cmp)(char*, char*);

— это объявление функции с типом возвращаемого значения int * и двумя параметрами типа char *.

Вы можете заключить декларатор в круглые скобки. Таким образом, приведенное выше объявление функции также можно переписать как

int * ( (cmp)(char*, char*) );

Оба объявления эквивалентны

int * cmp(char*, char*);

Объявление указателя на такую ​​функцию будет выглядеть так

int * ( *p_cmp )(char*, char*) = cmp;

Между этими декларациями нет разницы

char* ptr1;

char *ptr1;

char * ptr1;
person Vlad from Moscow    schedule 09.03.2020