Lio con tamaño variables char

vale str con sizeof me devuelve 0 mientras que con strlen me devulve 5, q si he leido bien cuenta hasta el \0 asique veo que no es 0 , jeje, ya me cuadra mas, lo del 4 se me fue quise poner 5 se q cuenta desde 1 pero asi mas claro agua, ahora una cuestion con punteros y referencias, estoy leyendo una memoria eeprom y lo estoy haciendo con ambas y realmente funciona pero quisiera saber si es la mejor manera.

//funcion de lectura, la escritura lo hago practicamente igual
void eeprom_read_page( int deviceaddress, unsigned int eeaddress, 
  byte *buffer, int length ) 
  {
   Wire.beginTransmission(deviceaddress);
   Wire.write((int)(eeaddress >> 8));   // MSB
   Wire.write((int)(eeaddress & 0xFF)); // LSB
   Wire.endTransmission();
   Wire.requestFrom(deviceaddress,length);
   int c = 0;
   for ( c = 0; c < length; c++ )
   if (Wire.available()) buffer[c] = Wire.read();
  }  
char ji[] = "12345"; //el dato almacenado en la posicion 0 y sucesivas

//comienzo lectura
char pi3[0];
Serial.println (sizeof ji);
byte *Dato3 = (byte *) &pi3; //con esta linea me ahorro el convertir nada paso el byte *buffer a int o a char, pero no entiendo muy bien como funciona ni si ocupa demasiado o se puede mejorar.
eeprom_read_page(0x50,0,Dato3,sizeof ji);
delay(10);
Serial.println(pi3); //saco el valor por el serial monitor y va pero esto es un char o un *char

La verdad que tengo un cacao con los punteros y refencia de aupa.