Take a look at inline actions (executed in the same transaction) or deferred transactions (executed in another transaction.
The link refers to the official developer portal. Inline actions will execute in the same transaction as the initiating action. If the inline action fails the whole transaction will fail. These actions also count to the transaction time limit, so keep an eye on the execution time.
I guess an important code snippet is to make a tuple for your action's data:
std::make_tuple(first_name, last_name, street, city, state)
The link refers to another thread on this Exchange. These transactions are completely new transactions which may be included in another block. There is also no guarantee that these will be executed. So keep an eye if your action actually gets triggered.
If you combine these clever you can perform mighty interactions between smart contracts. E.g. your contract's action sends an inline action to a write to another contract which will perform another deferred transaction that will notify the original contract on so on.