针的指针老是给人讲懂了又忘记,忘记了又讲懂了,但是就像是一个橡皮擦一样一直没有真懂,于是还得复习一下。
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:
point.c
#include
int main()
{
int a=8;
int *p;
int *p2;
printf("%p\n",&a);
p=&a;
printf("%p\n",p);
printf("%p\n",*p);
p2 = p;
printf("%p\n",p2);
printf("%p\n",p2);
printf("p=%p\n",&p);
printf("p2=%p\n",&p2);
printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。
[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8
#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}
[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8
问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/
最后呢,版权所有,向东,呵呵!
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:
point.c
#include
int main()
{
int a=8;
int *p;
int *p2;
printf("%p\n",&a);
p=&a;
printf("%p\n",p);
printf("%p\n",*p);
p2 = p;
printf("%p\n",p2);
printf("%p\n",p2);
printf("p=%p\n",&p);
printf("p2=%p\n",&p2);
printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。
[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8
#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}
[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8
问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/
最后呢,版权所有,向东,呵呵!
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1915/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2009-8-10 19:59
评论列表