Your phone numbers and addresses should have foreign keys to the contact table - not to the person table. e.g. Swap out p_id for c_id. THis is what he means by
"- Events, addresses and phones belong to contacts, not the user (person in your case), as you had indicated."
Conversely, the layout of the "contacts" table does not currently allow you to have multiple phone numbers or addresses associated with it. Each entry in contacts only allows one associated phone or address. By putting the foreign key constraint on the phone and address table, you are able to have multiple entries with the same c_id.
So e.g.
SELECT phone_number FROM phone WHERE c_id = '20715'
Will return all phone numbers for the contact 20715.
This is what he means by "You relate the contacts vs (address,events,phones) wrongly. If a particular contact has multiple phones for example, it would be difficult to accommodate those phones in the database."
You in order to have multiple phone numbers, you would have to have multiple records in the contact table, which defeats the purpose of a relational database.
You might also add a "type" column to phone and address - this way you can differentiate between a work # or a home #. You would then re-write your query as:
SELECT phone_number, type FROM phone WHERE c_id = '20715'
Results:
1203555555 Work
12035555454 Home
12035559999 Cell