Then what probably happens in printf("*p = %f \n q = %f, p = %p, &q = %p \n",*p,q,p,&q); is that the putative int *p is passed in a general purpose register, the double (the promoted value of q) is passed in a floating point register, the two pointers again in general purpose registers.
Like any variable or constant, you must declare a pointer before using it to store any variable address. The general form of a pointer variable declaration is − type *var-name; Here, type is the pointer's base type; it must be a valid C data type and var-name is the name of the pointer variable.
A pointer which does not have any address assigned to it is called a wild pointer. Any attempt to use such uninitialized pointers can cause unexpected behavior, either because the initial value is not a valid address, or because using it may damage other parts of the program.
char* and char are different types, but it's not immediately apparent in all cases. This is because arrays decay into pointers, meaning that if an expression of type char is provided where one of type char* is expected, the compiler automatically converts the array into a pointer to its first element.