Hola seanmilecín (igual eres un compañero, si no eres ignóralo).
Si lo editas por Visual Studio te indica a cada momento si los tipos introducidos corresponden con los solicitados en el prototipo de la función.
Si el argumento ha de ser un puntero a un tipo tiene que ser un puntero a un tipo. Siempre los arrays a char son punteros per sé por lo que no hace falta indicar el puntero de forma explícita.
char a[] = "Ejemplo";
a es un puntero hacia un array de chars por lo que a es válido como argumento que solicite un puntero hacia este tipo.
const char * const p[2] = { "chars", "chars2"};
Eso sería un array de punteros hacia chars y cada una de las entidades literales de chars son en sí arrays de chars (es una excepción) y por tanto punteros porque todas las referencias a arrays son punteros en sí mismos salvo que no sean literales.
char a[1] = {0x0f};
En el caso anterior es un array no literal de chars, así que se indica tradicionalmente entre { y }.
Entonces strcmp admitiría una referencia directa a los arrays de char
Código C++:
Ver originalchar a[] = "asd";
char b[] = "asd";
char *d = a;
a y b son punteros hacia char, tal y como lo especifica el prototipo. d sería un puntero hacia char por lo que es equivalente.
Código HTML:
Ver originalint strcmp ( const char * str1, const char * str2 );
Esto sucede porque
const char *const p = arraychar es similar a
const char *const p = &arraychar[0] por lo que se crea otro puntero en lugar de hacer un puntero de un puntero, como pareciera.
Un saludo.