Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10330
  • 博文数量: 4
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 08:46
文章分类

全部博文(4)

文章存档

2011年(1)

2009年(3)

我的朋友
最近访客

分类: C/C++

2009-11-09 13:13:45

昨天见到一小段程序如下:

#include <stdio.h>

int main(void)
{
   int a[5]= {1,2,3,4,5}
   int *ptr = (int*)(&a+1);
   printf("%d %d\n",*(a+1), *(ptr-1);

   return 0;
}


输出结果是 2  5;
我原以为是 2 2 呢,和一位学长讨论了半天才弄明白了,以前一直以为数组首地址就是数组第一个元素的地址,现在弄明白了,地址值虽然是一样的但意义却不一样的,对于数组a[5],a代表的a[0]的地址,而&a代表把数组当作一个整体取其地址,虽然地址值是数组第一个元素地址值,所以*(a +1)只是把指针移向数组a的第二个元素也就是2,而int  * ptr = (int *)(&a +1 ),其意义就是把整个数组作为整体,指针后移一个(此时ptr已经越界指向了a[4]的后一个位置,也就是指到a数组以外了),加入有(&a +2)就是从a[0]开始向后以数组a的整个程度为单位移动俩个单位
,但是*(ptr - 1)只是退后正常的一个int型。
加入还有一段程序:

#include <stdio.h>

int main(void)
{
     int b[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
     int *ptr = (int *)(&b+1);
     printf("%d\n",*(ptr-1));
     return 0;
}

则输出结果为 10。
因为二维数组在内存中也是以一维存在的,也是一段连续的内存空间(10个int型长度),如果知道a和&a的区别就很容易理解为什么是10了。

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