Por partes:
float z[100];
En esa línea estás creando un vector de floats... has de saber que cada float, por si mismo, no sabe nada de su entorno:
* No sabe que pertenece a un vector
* No sabe qué posición ocupa.
* No sabe cual es el elemento anterior ( si tiene ).
* No sabe cual es el elemento siguiente ( si tiene ).
La única forma de saber el orden del vector es mediante el vector z.
Este coñazo te lo explico porque ahora, en esta línea:
procesar(&z[50]);
Estás pasando la posición de memoria donde se encuentra el elemento número 50 del vector... pero claro... ese elemento no tiene ni idea de lo que tiene a su alrededor... es un simple puntero a un float.
Si quieres que tu función recorra un número de elmentos consecutivos tienes que indicar la posición inicial dentro del vector y la final... la primera te servirá para saber dónde empezar el recorrido y la segunda para saber cuándo has terminado.
Dicho con código... tu llamada tendría que tener, por ejemplo, esta forma:
procesar(&z[50], &z[99]);
Le pasas el primer elemento de la secuencia, es decir, el 51 ( recuerda que los índices empiezan a contar desde el 0 ), y el último el 100.
Y la función tendría que tener una cabecera tal que...
void procesar( float* f_ini, float* f_fin )
Y ahí ya tienes todo lo necesario para trabajar... solo tienes que ir incrementando el puntero f_ini hasta que coincida con f_fin y listo.
Recuerda que f_fin también forma parte del array... por lo que también has de procesarlo.
Y luego tienes la opción b... que es pasar el puntero a la primera posición a procesar dentro del vector y a la vez el número de elementos a procesar:
// ...
procesar( &z[50], 50 );
// ...
void procesar( float* f, int longitud )
{
// ...
}
En este caso tendrás que llevar tú la cuenta del número de incrementos en el puntero f para no pasarte.