有关于指针和指针变量的错误的理解

来源:互联网 发布:宝马编程培训 编辑:程序博客网 时间:2024/06/05 18:14

从cdsn上看到这么一篇程序:

#include <stdio.h>
struct S
{
int i;
int *p;
};
void main()
{
struct S s;
int *p=&s.i;
p[0]=1;
p[1]=2;
s.p=p;
s.p[1]=3;
        pritnf("aa");
s.p[0]=4;
}

以下是自己加的打印信息:

  1 #include <stdio.h>
  2 struct S
  3 {
  4         int i;
  5         int *p;
  6 };
  7 void main()
  8 {
  9         struct S s;
 10         int *p=&s.i;
 11         int q;
 12         p[0]=1;
 13         printf("p[0]=%p, s.i=%p s.p=%p\n", &p[0], &s.i,&s.p);
 14         p[1]=2;
 15         printf("p1=%d, %p\n", p[1],&p[1]);
 16         s.p=p;
 17         q=3;
 18         printf("aabb====s.p=%p,,%d, q=%p\n", s.p, &q);
 19         s.p[1]=3;
 20         int *pp = &s.p;
 21         printf("s.p=%d, s.p1=%p, q=%p\n",   *(pp), &s.p[1], &q);
 22         s.p[1]=4;
 23         printf("s.p0=%p, %d, s.p1=%p, %d\n", &(s.p[0]), s.p[0], &s.p[1],s.p[1]);
 24 }

打印的结果:

p[0]=0xbfb4062c, s.i=0xbfb4062c s.p=0xbfb40630
p1=2, 0xbfb40630
aabb====s.p=0xbfb4062c,,-1078720972, q=0xbfb40630
s.p=3, s.p1=0x7, q=0xbfb40634
Segmentation fault (core dumped)

程序的本身是很简单的,但是往往会绕晕掉,以下是我详细的解释:


前面流程就不多说了,从s.p开始吧,s.p=p,也就是s.i的地址,就是s.p指针变量里面存的是s.i的地址,s.p[1]所指向的地址其实也就是结构体定义s.p变量的地址,也是s。p指针变量本身的地址,不要搞混,(一个是指针所指向也就是所保存的地址,一个是指针变量本身的地址,注意两者的区别),当s。p[1]=3时候,也是往s.p指针变量里面保存3这个数值,这样就好理解了,那么s。p指针变量所指向的地址就是0x3,所以最后一句s.p[0]是地址0x3,s.p[1]地址是0x7, 跟打印出来的效果是一样的,这部分区域不可访问的导致报错。

另一种情况,假如s。p[0]放在s.p[1]的前面赋值,因为s。p[0]指向是s.i的地址,所以赋值没有错误,s。p[1]指向是s.p指针变量的地址,所以给s.p指针变量赋值是没有错的,就是改变s。p指向而已。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绗缝羽绒服钻毛怎么办 宝珠笔没墨水了怎么办 衣服上画的笔印怎么办 黑笔芯弄衣服上怎么办 圆珠笔油在皮上怎么办 不小心吞了水银怎么办 小孩吃了洗发露怎么办? 脸上被铅笔戳了怎么办 小孩吃了铅笔芯怎么办 小孩把橡皮吃了怎么办 用棉签掏耳朵里面疼怎么办 棉签头掉耳朵里怎么办 黑裤子老是粘毛怎么办 新买的裤子掉色怎么办 黑裤子容易粘毛怎么办 裤子粘了全部毛怎么办 纯棉裤子粘毛了怎么办 裤子粘毛怎么办怎么洗 黑裤子洗白了怎么办 新买床单有味道怎么办 新买的床单扎人怎么办 刚买的衣服皱了怎么办 橘子沾到衣服上怎么办 橘子水掉衣服上怎么办 菜汁滴在衣服上怎么办 饺子面和硬了怎么办 化纤衣服烫亮了怎么办 衣服穿久了发亮怎么办 买的毛衣长了怎么办 买的毛衣袖子长怎么办 新买的毛衣扎人怎么办 玻璃光纤线断了怎么办 家里光纤线断了怎么办 光纤线断了怎么办 找谁 光纤入户线断了怎么办 哈衣连体衣小了怎么办 毛巾用久了发硬怎么办 毛巾用久了发粘怎么办 棉衣服起毛球球怎么办 鞋前面折痕硌脚怎么办 毛衣压了有折痕怎么办