Hola Diego, el string puede quedar representado en un arreglo de distintas formas, entre ellas:
- char frase[] = "programacion2";
- char * frase = "programacion2";
Si utilizas un puntero a char, este apunta a una dirección de memoria donde se encuentra el primer caracter de la frase, por lo que podrías cambiar directamente los valores alojados en ese espacio de memoria. Una gran ventaja es que puedes pasar ese puntero como parámetro de una función, por lo que tendrías acceso a ese lugar de memoria desde dentro de la función.
Te recomiendo leer sobre punteros para utilizarlos correctamente.
Porque si me dicen que el string es un arreglo pasamos como parámetro un puntero a un arreglo? No podría pasar directamente un arreglo y manipular el arreglo? En qué varía eso? Esa sería mi pregunta mejor planteada
Los arreglos, a diferencia de otras estructuras, pueden ser manipuladas dentro de la función. Por lo tanto, en este caso, puedes manipular el arreglo dentro de la función incluso si no usaste puntero.
Yendo a tu última pregunta, los punteros tienen algunas ventajas, entre ellas la posibilidad de crear estructuras dinámicamente y también pasar eficientemente estas estructuras a través de parámetros en los procedimientos. Si en algún momento tienes que crear estructuras más complejas que un arreglo, para poder modificarlas dentro de un procedimiento necesitarás hacerlo a través de punteros.
Re: Ejercicio 2
ya que un arreglo de int para el lenguaje es int * a, no importa si tu escribes el parámetro como int a[], int a[10] o int * a, porque a la hora de compilar todos son int *a. Es la única excepción donde pasa esto. ya que las demás variables si puedes elegir entre pasar por valor (se copia el valor a una variable temporal solo para el scope de la función) o por referencia, dirección de memoria.
Si haces la prueba de poner como parametro int a[]; y al llamar la funcion le pones un int, te va a saltar un error de que se esperaba un int *.
