If you are not supporting more than one country, best way to show the country default selected, as Luke shown in his solution.
Once again keep it in mind that the address format not necessarily same in all countries.
That’s why I must probe which countries my app will be supporting.
If it is limited to single country, for example India, I will keep country as default selected and design as following:
Now first understand how zip functions in India:
Zip code in India is 6 digits.
The first digit of the PIN code indicates the region (total 9 regions, each covering min 3 and max 12 states).
The second digit indicates the sub-region, and the third digit indicates the sorting district within the region.
The final three digits are assigned to individual post offices.
So obviously I cannot select state based on zip code, or I may have to look for such services or develop in-house to support my thought, so without such services, max I can apply filter to minimize the selection options in state drop-down menu .
Once this is clear, I will put my fields as following:
Address line 1 (This is the popular way we Indian start writing our address, free text)
Address line 2 (is it really necessary, if yes, make these labels specific like Street details, area, landmark, etc.-I will say avoid )
State (this will help me reducing the next field’s options)
City (Select/free text - depends on your research, for example - if services are limited to metro or top cities in state)