Warning: Now for my own dire warning: While the statements made here are likely correct and represent long-standing best practices in the electronics industry, they may be wrong. So everything I say here may be wrong and if you do damage as a consequence of believing me, I am not responsible.
First, you need to know that digital inputs need to have protection or they will die in normal operation. The reason is that switching of neighbouring signal lines can induce voltage spikes way above Vcc and way below GND. The inputs need to be able to survive that.
The standard way is to just put in protection diodes. Unfortunately the Pi seems to only have normal protection diodes to GND, not to 3V3. What I found in some measurements is that the protection against positive overvoltage seem to be some kind of passive Z-Diode-like scheme. I measured about 6.4V Voltage at 100uA input current, on several differtent inputs, regardless of whether the Pi was switched on or off. At 5.5V input voltage, I measured about 2.4uA input current.
Now, 100uA is far too large for any insulator (such as a MOSFET gate) breaking down, such a break-down would not result in voltages this closely aligned and the difference in input voltages at 2uA and 100uA is not consistent with a damaged insulator. This indicates the Pi's inputs are protected against over-voltage. It is even possible that they are designed to be 5V tolerant (even with the Pi is switched off), but I cannot confidently state that without a look into the (missing) datasheet. What I can say is that on my Pi, connecting an input in input mode directly to 5V would not kill it, the currents flowing are just way too small.
Note: This does not apply to the two I2C pins that have pull-up resitstors on the board, they need a proper I2C level-shifter. More below.
Effect: This will in effect make the pin 5V-tolerant for digital I/O and will work as long as the 5V circuit interfaced does not have more than 1 LS-TTL load input current. That means it will work for for most CMOS circuits, like the MAX1226 SPI A/D converter. It will also work for basically all TTL-compatible CMOS logic families like 74HCT, 74ACT, 74LVC, etc. The thing to look for in the datasheet is the minimum input H voltage, typically called V_IH. it should be at or below 2.4V for this to work reliable.
For CMOS-level digital signals, where the Pi GPIO pin is used only as input, you can still use this scheme. But driving CMOS-level inputs from a Pi GPIO pin used as output is at the very least unreliable, as these inputs need 3.3V for a solid H, and that is difficult to generate from a 3.3V supply. Here, you need a proper dual-voltage level-shifter, such as the one described for I2C below or you need to add a pull-up resitor of 1 kOhm to 5V. Fortunately, digital circuits requiring CMOS-level input signals are rare today.
If there are positive voltage spikes, the Pi's protection circuit will shorten them out to something like 6...7V and the resistor will liomit the current, in turn protecting the protection circuit.
Note that this is why you cannot use the 1kOhm technique with TTL inputs having a higher load. For example, a standard TTL input has up to 1.6mA flowing out of in on a L, which would push the input voltage it sees up to about 2V and right into the forbidden zone. (Yes, bipolar TTL inputs have an output current when an L signal is applied. The explanation why is out of scope of this document.)
If you use the two I2C GPIO pins as normal outputs, you can still use the 1kOhm design, but it fails for input and I2C mode. For that you need a bi-directional level shifter.
The authorative reference is by NPX (used to be Philips), described in this Applicatio Note. The SMD FETs are a bit tricky to handle, but you can roll your own level shifter following this document. You can also get them pre-assembled, e.g. from Sparkfun, just search for "Logic Level Converter". Make sure to connect the higer voltage to "HV" and the lower one to "LV" and use only the "TX" conections, the "RX" ones are not bi-directional.
Also note that these level-shifters are relaticvely slow, and can add 100ns delay or more. For I2C with a maximum clock rate of 400kHz, that is fine. But shifing a fast SPI bust this way is unlikely to work or may not be reliable.