Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23930
  • 博文数量: 19
  • 博客积分: 1445
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-30 10:52
文章分类

全部博文(19)

文章存档

2011年(1)

2009年(18)

我的朋友
最近访客

分类: C/C++

2009-11-26 10:06:30

 

#include <iostream>
using namespace std;

struct S
{
    int i;
    int *p;
};

int main()
{
    S s;
    int *p=&s.i;
    p[0]=4;
    p[1]=3;
    s.p=p;
    s.p[1]=1;
    s.p[0]=2;
    
}

 

 

详细的解释:


 

struct S
{
  int i;
  int *p;
};
main()
{
  S s; //定义一个结构叫s
  int *p=&s.i; //定义一个指针,指向s.i 地址
  p[0]=4; //设置p[0]等于4,就等于设置s.i=4
  p[1]=3; //设置p[1]等于3,就等于设置s.p=3, 指针等于3,是一个非法指针
// 像上面这样操作地址很危险,初学者不易效仿。
// 应该用s.i=4, s.p=xxx 来赋值
  s.p=p; //重设s.p 为p 地址, s.p 目前为合法地址
//注意,s.p目前直到了s 地址上,即指到了自己的头顶上。
//所以有s.p[0] 就是 s.i, s.p[1]就是s.p
//这是鸟考官故意设的圈套,初学者也不易效仿。 世界之大,非指到自己头上干什么
//想找麻烦吧。
  s.p[1]=1; // 这一项,把s.p的内容给改掉了。变成了1,很可恶。
  s.p[0]=2; // s.p 已经出错了,再来操作s.p(向s.p所指空间读写数据)就会异常了。
  system("pause");
  return 0;
}


阅读(354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~