¿En qué momento se le pasa el arreglo s?
's' es el nombre interno del array en la función 'getline', como 'getline' es invocada desde la función 'main', resulta que el array 's' es en realidad el array 'line', así el punto exacto donde se le pasa dicho array es en:
while ((len = getline(
line, MAXLINE)) > 0)
¿El arreglo s que está dentro de getline tiene una extensión de 1000 caracteres al igual que line?
Como acabo de señalarte, es el mismo array, luego es lo mismo...
Que una función 'x' tenga parámetros llamados así 'a', 'b', 'c':
Funcion x(a, b, c)
y luego tu lo invoques así:
llamada a x("hola", s, (k+23) )
no altera nada, cada parámetro si sigue siendo del mismo tipo, en otra parte tendrá otro nombre, al final o se pasa una dirección de memoria que contiene el valor o un valor inmediato... es decir en otra parte puede llamarse de otra manera...
Un ejemplo llano: Hay 3 estudiantes, Luis, Carlos y Antonio, y tienen 20, 25 y 30 años respectivamente, Luis estudia, Carlos trabaja y Antonio se toca los "0,0"... entonces en otra parte podrían llamarlos de la siguiente forma:
--- Carlos venga usted para acá"... como se llama Carlos, se sabe quien es.
--- El que trabaja, que venga para acá... como 'trabaja' es un atributo de Carlos (digamos que s elocaliza en memoria, por una dirección alternativa...
--- El que tiene 25 años, que venga para acá....
incluso aún s ele podría decir:
--- El segundo de la fila, que venga para acá (símil que reflejaría estar dentro de un array).
en todos casos se está llamando a 'Carlos' pero con diferentes 'nombres', no importa en unos se le llama por su nombre, en otros por su valor o una referencia, incluso una referencia a una referencia, etc...
Entonces en la funcion 'main', 'line' es el nombre de un array (pongamos que es Carlos), pero cuando se invoca getline(carlos), luego la función 'getiline' lo llama 's' que podríamos decir que ahora en vez de llamarlo 'Carlos' lo llama 'el que trabaja'...
int getline(char elquetrabaja[], int lim)
int getline(char elquetiene25años[], int lim)
int getline(char elsegundodelafila[], int lim)
como tu le pasaste 'Carlos' pués ese es el que recibe, luego 's' y 'getline' son la misma cosa, el mismo contenido.
Es decir, no estás obligado a darle el nombre a una variable que tu has creado y vas a usar con el nombre que tiene el parámetro en una función... imagina que ese array se tuviera que pasar a 3 funciones diferentes, podrían tener diferentes nombre... luego si fuera una exigencia tener el mismo nombre impediría que pudiera ser usado en más de una función.
El nombre de un parámetro solo tiene sentido fuera para saber que se espera, para diferenciar con claridad que se pretende recibir, una ayuda al que usa la función, internamente poco importa el nombre, de hecho en funciones simples sin complejidad alguna y que quedan ocultas (nunca son llamadas desde fuera), suele ponerse nombres sin importancia como 's'...
Un ejemplo que clarifica que se pide en cada parámetro y que una vez dentro poco importa, los nombres usados internamente... al caos reg, se supone una clase que no es accesible desde fuera, y tiene nombres que no precisan aclarar mucho o nada, o si se prefiere podría ser una estructura y luego se invocaría un método 'save' usando como parámetro la estructura 'reg'...
funcion GuardarRegistro( char nombre[], char apellido1[], char apellido2[] )
// reg se supone una clase o si prefieres una estructura y luego un método: save(reg)
reg.x=nombre;
reg.y=apellido1;
reg.z=apelido2;
reg.save; //save(reg);
fin funcion
OJO... al decir que dos parámetros son el mismo, no es estrictamente cierto, solo mientras se pase por referencia, a veces no se quiere que se modifiique el original, entonces se pasa una 'copia' así cualquier modificación que se haga al que se pasa, deja intacto al original, la copia suple el mismo efecto (para lo que se necesite que se deba hacer con los datos recibidos) que usando el original, pero dejando el original intacto.
Espero que este pequeño sermón aclare tus dudas.
Si tienes además algún IDE instalado, es bueno que ejecutes el programa "paso a paso", porque así y ahí es donde se descubre todo el potencial que ofrece un IDE, al saltar de una línea a la siguiente, e ir viendo la ejecución de adónde salta, consutar que valor contiene una variable etc... es decir ejecutando en modo DEBUG, se aprende mucho más y más rápido que solo leyendo y por ejemplo escibiendo en un 'procesador de texto' como algunos ingenuos creen que es mejor viendo pelis (nunca es mejor y menos para el que empieza, para el que todo son tinieblas... hasta que se despejen las nubes).