Your print_2d function is declared as accepting a pointer to char[10] array. However, nowhere in your code there's a char[10] array. There's noting in your code that can be legally passed to print_2d.
Anyway, it is not possible to "fix" your code, until you explain what you are trying to do.
Judging by the body of print_2d and by what you have in main, you might need the following
void print_2d(char *(*p)[10],int r)
{
int i;
for (i = 0; i < r; i++)
printf("%s", (*p)[i]);
}
int main()
{
char *s[10] = { "one", "two", "three", "four" };
int r;
r = sizeof(s) / sizeof(s[0]);
print_2d(&s, r);
}
Note that parameter p is declared as a pointer to an array of char * pointers, which is what your s in main is. However, you have to realize that pointer to array can only point to an array of fixed pre-determined size. The array passed to print_2d will always have size 10 and only 10. For this reason, it makes no sense to pass array size to print_2d separately. Just calculate the size inside and get rid of the second parameter
void print_2d(char *(*p)[10])
{
int i, r;
r = sizeof *p / sizeof **p;
for (i = 0; i < r; i++)
printf("%s", (*p)[i]);
}
int main()
{
char *s[10] = { "one", "two", "three", "four" };
print_2d(&s);
}
Alternatively, your code can be fixed as shown in @BLUEPIXY's answer, but that is a completely different way to interpret your intent. And we don't know what your intent was.
sis declared as an array of pointers...