void main()
{
int *p//P是一个整型指针
printf("%d\n",p)//以10进制整数的形式输出指针P的值
printf("%d\n",&p)//以10进制整数的形式输出指针P的地址
}
P是指针
&P是指针P的地址
*P是指针P的内容,也就是P所指向的那个地址
注意,内存中的地址都是16进制的,可以转化为10进制,不过不是很推荐这么做。
指针也是整数编号,也是可以进行运算的。计算机内存就好比是一个有编号的抽屉,每个小单元(字节)都有编号,从0开始到最大内存数。
程序需要访问哪个内存,就得告知计算机在哪个编号。
题中p一开始指向字符首地址,经过while后指向字符串末尾,相减就是字符串的长度。字符串是存在连续的内存空间,所以可以这么算长度。
C语言中,*p 和p都常用在指针当中表示一个指针变量,*p 和p的区别:
1、表示的含义不同
*p表示此指针指向的内存地址中存放的内容。
p表示一个指针变量的名字,指此指针变量所指向的内存地址。
2、输出的格式不同
*p一般是一个和指针类型一致的变量或者常量。
p输出的是一个16进制数, 输出一个指针的地址。
3、功能不同
*p是让程序去那个地址取出数据。
p存放的是地址。
例子:
1、int a[5]={1,2,3,4,5}
int *p=a//这是在定义指针变量p的同时就直接给它初始化,即把数组a的首地址赋给它。
2、int a[5]={1,2,3,4,5}
int *p//声明指针变量p
p = a
扩展资料
(*p)操作是这样一种运算,返回p 的值作为地址的那个空间的取值。(&p)则是这样一种运算,返回当时声明p 时开辟的地址。可以用赋值语句对内存地址赋值。
例:
int *p
p=2003H
*p=3000H
结果:
**p=*(*(p))=*(*(2003H))=*(3000H)=3000H。
&&p=&(&(p))=&(3001H),此时出错了,3001H 是个常数无法存放地址。
*&p=*(&(p))=*(3001H)=2003H,也就是*&p=p。
参考资料来源:百度百科——p (C语言)
百度百科——指针