Q:

Why are functions designed as pointers? 

Functions are essentially treated as pointers to functions in all cases in C and nearly all in C++. 
I want to know why it is designed this way?  Wouldn't it be perfectly fine if it was simply a function type, as in a variable much like a int or any other primitive? 
typedef void(int) func_t
void foo(int);
void bar(int);
func_t fp = foo;  // What's wrong with this? 
fp = bar;  // Acts like any other primitive

As far as I can see, function acting like pointers instead of primitives only makes templating for them hellish :P
As a side note, a lot of languages do treat functions as just that.  For instance golang
func foo(int) {}
var fn func(int)
fn = foo

EDIT Got deleted because it was written in a bad mood. 
EDIT2 The representation of functions in memory is irrelevant to how they are being presented in a language.  The language is meant to bridge the gap between hardware and logic, as such, it wraps up the hardware stuff into easier to grasp concepts. 
For instance, a number as an address is pretty error-prone and difficult to think about, and C came up with the solution of giving it the pointer semantics.  It is obvious now, that pointers should not be able to be multiplied, and is different from a number.  Pointers actually form an affine space. 
I make the same argument that function pointers should in fact, not be thought of as pointers despite it being represented as one, in memory. 

A:

I'll answer your question with another question: how would you represent a function as a value? 
A function is basically a block of code, right?  And this code can be a variable length, right?  So, how do we refer to a variable length block?  We refer to a pointer to the start of the block. 
I'm sure other answers would go into more detail, but this is perfect for a basic grip on how this works. 
As for any language where it seems functions are value types, I assure you there is a pointer somewhere in the internal representation (or it's just syntax sugar).