Как правильно передавать char и const char элементы массива в параметры указателей на функции

Пример функции:

char* strcpy1(char* sr1, const char* sr2) {
    return (*sr1 = *sr2) ? (strcpy1(sr1 + 1, sr2 + 1), sr1) : sr1;
}

Проблема в том , что я не совсем понял про массив указателей:

char cmp[14][10] = { "abc","","","abc","abc","abbc","abbc","aba","abbc","abba","abcd","abd","abcd","abcef"};
int (*Masstrcmp[])(const char* p,const char*l) = {strcmp1,strcmp2,strcmp3,strcmp4};

этот код работает правильно, но можете обьяснить принцип работы?

И еще один момент, с функцией strcpy не ясно:

char cpy[4][10] = { "abc","abc","abc","abc"}; const int i = 0;
const char *cpy1[] = {"","","",""};
char (*Masstrcpy[])(char cpy[],const char cpy1[]) = { strcpy1,strcpy2,strcpy3,strcpy4 };

компилятор ругается на запись, как ее можно исправить?


Ответы (1 шт):

Автор решения: AR Hovsepyan
 return (*sr1 = *sr2) ? (strcpy1(sr1 + 1, sr2 + 1), sr1) : sr1;

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

*sr1 = *sr2;
if (*sr1) {
    strcpy1(sr1 + 1, sr2 + 1);
    return sr1;
}
else
   return sr1;

Дальше определяется массив указателей на функцию

 /*Ваш код не может компилироваться по одной важной причине. 
 Возвращаемый тип указателя на массив функций, не совпадает с 
 возвращаемым типом  функций, чьи указатели вы пытаетесь присвоить 
 указателям массива, замените на: */
 char* (*Masstrcpy[])(char [],const char []) 
 //тут имена аргументов не играют роли

Masstrcpy это массив указателей на функции, которые принимают char* и const char* и возвращают char* . Массив можно инициализировать списком инициализации, и таким образом вы инициализировали массив cmp. Вот и инициализируем его:

 = {strcmp1,strcmp2,strcmp3,strcmp4}

И, естественно, Masstrcpy[0](str1, str) то же самое, что и `strcpy1(str1, str)

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

→ Ссылка