As you've already heard, C checks the type of its pointers. There is a VERY GOOD reason for this, which I will get to in a moment. But when you do "&number" in your code, C says to itself, "the programmer wants a pointer to an int." Then you try assigning this to a "pointer to a char." So C complains because:
(1) They aren't the same type of pointer and it's possible you were making a mistake.
(2) It's possible that a pointer to an int may be of a different size (smaller) than a pointer to a char. That's not likely, but the standard permits the idea. The standard does say that a "void *" and a "char *" must both have the same size and alignment requirements, though. But it does NOT make such statements for other kinds of pointers, except to say that if you store some other kind of pointer into a "void *" pointer, that the void * pointer must be large enough to hold all of the other kinds data type pointers and that a conversion back and forth, say from int * to void * and then back to int *, should work okay so long as you are using it correctly.
(3) When using a pointer with autoincrement or autodecrement or with an index value, as in *p++ or p[5] for example, the C compiler needs to know the size of the object that is referenced so that the increment or decrement to the pointer is made properly to point to the next item of that type (or indexing into the array.) This is a semantic issue and is important. So the warning here ALSO is done to let you know that the C compiler won't make the same use of indices or autoincrement or autodecrement operations between the two pointers. That said, it is NOT the case that you can convert a char * to a double * and then convert it back to a char * and expect it to work -- it's possible that a double * is smaller than a char * and that some bits will be lost in the conversion and cannot be recovered. (Again, this isn't usually a problem, but can be on some machines.)
#3 is probably the most important reason for a warning.