What puzzles you is that after
int i[5]={0,1,2,3,4,};
int *ip=&i[0];
"both ip=&i=2358832 but *ip=0 and *(&i)=2358832. How can one address, in this case 2358832, have two values?".
Two expressions each yield an address with the same numerical value. How can there be different values stored at the same address, as proven by printing the result of dereferencing these same addresses?
The answer must lie, if you think of it, in the type of ip vs &i (and printf's weak type checking). It's related to one of the subtleties of the C/C++ (hi Lundin) type system. Often an array "decays", as the lingo goes, to a pointer to its first element. That's why you can pass i to a function that takes a pointer (e.g. printf), or add 1 to it and get the address of the next element, or simply dereference it like *i.
Taking the address of an array is one of the cases where it does not decay. It stays an array; &i has the type "pointer to array", not "pointer to int". The array shares its address with its first element, so the numerical values are identical. But what the compiler does with the pointer is different:
Dereferencing &i gives you the array back, like with any other type; and what happens when you pass that to a function like printf? Finally it decays to a pointer to its first element, which happens to be at the well-known address 2358832.
It may become clearer if you imagine a struct in place of the array; the two are related (a struct is also a series of objects, only of different types). A pointer to the first struct member has surely a different meaning than a pointer to the struct, although they as surely have the same numerical value.
Or take the following little (strictly spoken, undefined behaviour) program which shows that the same address can carry "different values", depending on what you tell the compiler to do with the data there:
#include<stdio.h>
int main()
{
unsigned int sixpointo = 1086324736;
float *fp = (float *)&sixpointo;
printf("&sixpointo: %p, fp: %p, sixpointo: %d, *fp: %f\n",
&sixpointo, fp, sixpointo, *fp);
return 0;
}