Gyro basic problem

Wire.beginTransmission(gyro_address);
  Wire.write(who_am_i);
  Wire.endTransmission();
  Wire.requestFrom(gyro_address, 1);
  timer = millis() + 100;
  while(Wire.available() < 1 && timer > millis());
  lowByte = Wire.read();
  address = gyro_address;
  return lowByte;

In this code the function is supposed to return the address of the gyro searched,can you explain to me the basic logic of how that is happening?

2)what is the use of Wire.write(who am i)?
3)how lowByte=gyro address ie why does Wire.requestFrom(gyro_address, 1); return the gyro address and what if it was Wire.requestFrom(gyro_address, 2);

Thank you, will be amazing if you guys can help me with this problem

  1. instructs the gyro to return data from a certain register.
  2. request and read one byte of data. Read the gyro data sheet to understand why.

Wire reference library