-snip-
If a wallet uses a different address for each transaction, how can the addresses/transactions be linked to each other?
Lets say you create a new address for every time you receive bitcoins (as you should and I hope most of us do). You receive several inputs[1] over time, e.g. like below.
0.00369522 and 0.003 on address A
0.10, 0.05 and 0.05 on address B
Now you want to spend 0.2 BTC (and add a fee). For this you will need inputs that you received via A and B. The inputs you received via B are enough for 0.2, but you still need to pay a fee, so you need another input and will also need a change address. When you create a transaction like that the addresses are considered to be related and its commonly accepted that they belong to the same person even though it is possible that several people create a single transaction. On top of that usually you cant cherry pick the inputs either the wallet will just pick them for you, AFAIK Coin Control for bitcoin core/qt is the exception to that. It lets you pick each input before you create a transaction.
You can obfuscate this by using a mixer.
tl;dr you can use different addresses to receive bitcoins, but you have a limited control over the "sending" address.
[1] A transaction is spending formerly received coins (inputs). These inputs have to be spend entirely. If your inputs are higher than your output(s) a wallet will generate a change address for you for the rest. If the inputs have been received on different addresses they appear in blockexplorers as the sending addresses even though technically addresses can not send bitcoins. Example:
https://www.blocktrail.com/BTC/tx/b07a2b5647621789d95ae456f3f71f7034fb820e921d9f2e4fea7a3db8b733b9this TX spends two inputs into two outputs.