#include <stdio.h>
int main(void)
{
int x; int *p1,*p2;
p1 = &x;
p2 = p1;
printf(" %p ",p2); /* print the address of x,not x's value */
return 0;
}
%a 浮点数、十六进制数字和p-记数法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 用科学计数法表示的浮点数(同%e)
%f 浮点数、十进制记数法
%F 浮点数、十进制记数法(同%f)
%g 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 无符号十六进制整数,并以小写abcdef表示
%X 无符号十六进制整数,并以大写ABCDEF表示
%% 打印一个百分号
任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:
#include <stdlib.h> #include <stdio.h>
int main(void)
{
int a=8;
int *p;
int *p2;
printf("%p ",&a);
p=&a;
printf("%p ",p);
printf("%p ",*p);
p2 = p;
printf("%p ",p2);
printf("%p ",p2);
printf("p=%p ",&p);
printf("p2=%p ",&p2);
printf("%d ",*p2);
return 0;
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。
格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。
示例:
int i = 1;
printf("%p",&i);
相当于
int i = 1;
printf("0x%x",&i);
对于32位的指针,输出一般会是类似0xf0001234之类的结果。
%p存在的理由除了附加前缀输出的便利性以外,指针的大小是不确定的,由实现决定。根据地址空间的大小,一般有16位、32位、64位的指针。尽管目前32位平台上的指针一般全是32位的,但旧的一些平台上可能有多种长度的指针(例如非标准的near、far、huge修饰的pointer)混用,无法用%x、%lx、%hx、%llx(对应int、long、short、long long)中的任意一种保证能输出所有类型的指针。