内容参考自:
      
       点击打开链接
      
     
    
   
    
     
      
     
    
   
    
     
      我们知道在C语言中用printf函数可以以不同的格式打印输出内容,如:%d,%c,%s等,这些我们都比较熟悉。
     
    
   
    
     
      但有时候,我们会见到
      
       printf(“%p\n”,p);这样的语句,那么%p是什么意思呢?
      
     
    
   
    
     
      
       下面让我们一起来看看吧。
      
     
    
   
    
     
      
     
    
   
    
     
      首先说明一下,printf(“%p\n”,p);
      
      就是把p2的内容当成是指针来输出,不是输出p的地址,实际上与输出十六进制格式差不多。
      任何变量都有地址,变量名指向它的内容(指针的内容是地址,而非指针类型内容可能是char、int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(里面存的地址),而加&来打印指针的时候呢,打印的是该指针的存放地址而不是其内容(里面存的地址)。
     
    
   
    
     
      下面来看一段测试代码:
     
    
   
    
    
   
#include <stdio.h>
int main(void)
{
	int a=8;
	int *p;
	int *p2;
	printf("%p\n",&a);  //变量a的地址
	p=&a;
	printf("%p\n",p);  //p指针里面的内容(即变量a的地址)
	printf("%p\n",*p);  //相当于以十六进制输出变量a
	printf("%p\n",a);  //相当于以十六进制输出变量a
	p2 = p;
	printf("%p\n",p2);  //p2指针里面的内容(即变量a的地址)
	printf("p=%p\n",&p);  //p指针的存储地址
	printf("p2=%p\n",&p2);  //p2指针的存储地址
	printf("%d\n",*p2);  //以十进制输出变量a
	return 0;
}
   
    
    
     问:如果想打印p指针本身的地址,怎么写?
     
     答:printf(“%p”,&p);
     
     问:p2=p是如何赋值的?
     
     答:p的指针内容(里面存的是个地址)赋给p2。
     
     问:p,p2存储的内容(地址)相同,它们两个的地址也相同?
     
     答:不同,可以通过打印他们的地址:printf(“%p”,&p);  与 printf(“%p”,&p2); 来对比一下。
    
   
   
 
