Storage Options

Stack

function add(uint a, uint b) public pure returns (uint) {
    return a + b;  // a, b are stored in the stack
}
//inline assembly example
function example(uint x) public pure returns (uint) {
    assembly {
        x := add(x, 1) // reads and writes directly
    }
    return x;
}

Memory

function doubleArray(uint[] memory input) public pure returns (uint[] **memory**) {
    for (uint i = 0; i < input.length; i++) {
        input[i] *= 2;
    }
    return input;
}

Calldata