Es que de la forma que planteaste es imposible usar strncpy, porque le pasas un char como parámetro cuando el esperado es char*.
No hay ningún problema en asignar caracteres de esa forma, porque haciendo "arreglo[i]" te referís a una posición del vector, no a toda la cadena.
La única forma de usar strcpy como plantean es que "arreglo" sea un arreglo de punteros, pero según veo no es el caso.
Suponiendo que "arreglo" es una cadena (char[]), la única forma de usar strcpy junto con la sintaxis de arreglos, es pasando la dirección de memoria de dicha posicion. Algo así:
Con lo cual strcpy comenzaría a copiar desde la posición expuesta. En este caso no tiene mucho sentido hacer algo así, ya que asignar caracteres a posiciones de un vector es perfectamente valido. Lo que es invalido es asignar dos cadenas (char[], por lo menos en C, no sucede lo mismo con strings en C++/STL).
Saludos