Pointers can be avoided in the design of a high-level language's paradigms - take java for example - but they tend to show up again in actual practical implementations of the functionality the language claims to provide.
Unless you are using some sort of dynamically reconfiguring FPGA architecture, colony of state machines or similar idea as your computer, actual computing machinery is not very object-oriented. We don't perform operations in the storage device, instead we fetch data, do computations on it, and write it back. To find data in memory, we use the concept of an address (there are things called content-addressable memories, but for most purposes they are not preferable). Once you decide that your data (or function body, or struct containing both) is in memory at some address, you have to figure out how you are going to handle the address. You can write the address in yet another memory location and we have the most familiar concept of a pointer. You can store the address on the stack, but that's just storage relative to a register called the "stack pointer". Or you can store the address in a register or instruction word.
But, if you look at the actual format of an instruction word, for non-trivial processors "registers" are actually numbered locations in special on-chip memory called the register file. The RISC tradition of numbering them makes this particular obvious, but it's true even in assembly language schemes where registers are named - a MOV or whatever instruction will have a few bits that determine the type and format of instruction, and a few bits encoding the register number for each operand. Therefore, register indirect addressing is technically one memory location holding the address of another, which is to say a pointer. Similarly, the address of a data item which is directly encoded in an instruction word is also an example of one memory location (program memory containing the instruction word) referring to another where the data is actually kept.
Conclusion: you can hide pointers from the high level programmer, but as long as your implementation is based on the
(addressable data memory/register file) <-> CPU -<-> (addressable program memory)
idea of computation, you cannot avoid them at the implementation level.