How does bitcoind find p2p hosts? I read the bitcoin references but I can't find a description regarding how bitcoin clients find other host in the p2p network.
Would you please tell me?
There are several methods for a bitcoin client to find other nodes.
First of all they save a list of nodes from previous connections. 
Of course this only works when they don't connect the first time.
If a client has no IPs stored it falls back to DNS-Seeds:

Bitcoin looks up the IP Addresses of several host names and adds those to the list of potential addresses. This is the default seeding mechanism, as of v0.6.x and later.

Once a client is connected to the network, it will ask for a list via the Addr-Message containing a list of IPs of known clients.
As you can see in the Bitcoin-Wiki there was another method, which is no longer used:

IRC
Bitcoin joins a random channel between #bitcoin00 and #bitcoin99 on irc.lfnet.org. Your nick is set to an encoded form of your IP address. By decoding all the nicks of all users on the channel, you get a list of all IP addresses currently connected to Bitcoin.