Question 1 :
A pointer to a block of memory is effectively same as an array
Yes, It is possible to allocate a block of memory (of arbitrary size) at run-time, using the standard library's malloc function, and treat it as an array.
Question 2 :
Does this mentioning array name gives the base address in all the contexts?
No, Mentioning the array name in C or C++ gives the base address in all contexts except one.
Syntactically, the compiler treats the array name as a pointer to the first element. You can reference elements using array syntax, a[n], or using pointer syntax, *(a+n), and you can even mix the usages within an expression.
When you pass an array name as a function argument, you are passing the "value of the pointer", which means that you are implicitly passing the array by reference, even though all parameters in functions are "call by value".
Question 3 :
Is there any difference int the following declarations?
int fun(int arr); int fun(int arr);
No, both the statements are same. It is the prototype for the function fun() that accepts one integer array as an parameter and returns an integer value.
Question 4 :
Are the expressions arr and &arr same for an array of 10 integers?
Both mean two different things. arr gives the address of the first int, whereas the &arr gives the address of array of ints.