问:

C语言: 为什么p和*p的地址是一样的?

答:
在C语言中,指针变量p和被指针变量*p的地址是相同的,这是因为:
1. 指针变量p本身也是一个变量,占有独立的内存空间,用于存储指针指向的地址。
2. *p表示指针p所指向的变量,可以通过p间接访问这个变量。*p不是一个独立的变量,它和p所指向的变量共用同一块内存。
3. 由于*p和p所指向的变量共用一块内存,所以*p的地址就是p所存储的地址,二者地址相同。
例如:
int a = 10;
int *p = &a;   // p存储a的地址,值为0x100
此时,p的地址可能为0x200,*p(等同于a)的地址为0x100。
虽然p和*p代表两个不同的概念:一个是指针变量,一个是指针指向的变量,但因为*p共用p所指向变量的内存,所以地址相同。
可以通过下面的代码验证此理论:
int a = 10;
int *p = &a;
printf("a的地址:%p\n", &a); 
printf("p的地址:%p\n", p);   
printf("*p的地址:%p\n", &*p);
运行结果:
a的地址:0x7ffd40630d44
p的地址:0x7ffd40630d48   
*p的地址:0x7ffd40630d44
可见,a和*p的地址相同,与p的解释相符。
总之,指针变量和被指针变量虽然在概念上不同,但在内存级别上,*p共用p所指向变量的内存,所以地址相同,这是理解指针的关键。