Chinaunix首页 | 论坛 | 博客
  • 博客访问: 712113
  • 博文数量: 134
  • 博客积分: 3207
  • 博客等级: 中校
  • 技术积分: 1995
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 20:47
文章分类

全部博文(134)

文章存档

2022年(1)

2020年(7)

2018年(2)

2016年(5)

2015年(14)

2014年(21)

2013年(3)

2012年(1)

2011年(15)

2010年(30)

2009年(35)

分类: C/C++

2009-10-11 16:03:42

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[3] = {7,8,9};

    printf("一维数组测试:\n");

    printf("a = %p\n", a); /*这里打印数组a的首地址,相当于&a[0]*/
    printf("*a = %p\n", *a); /*这里打印a[0]的内容*/


    printf("&a = %p\n", &a); /*这里打印与数组a的首地址相同的地址。*/
    printf("*(&a) = %p\n", *(&a));/*这个还是数组a的首地址*/

    
    printf("a+1 = %p\n", a+1); /*这里打印数组a[1]的地址*/
    printf("*(a+1) = %p\n", *(a+1));/*这里打印a[1]的内容*/

    /*以下打印很苦涩,下面详细解说*/
    printf("&a+1 = %p\n", &a+1);
    printf("*(&a+1) = %p\n", *(&a+1));

    
    printf("(&a+1)-&a = %p\n", (&a+1)-&a);
    printf("*(&a+1)-a = %p\n", *(&a+1)-a);
    printf("*(&a+1)-*(&a) = %p\n", *(&a+1)-*(&a));

    getchar();
    return 0;
}

首先我们要知道以下定义:

int (*p)[3];

p = &a;

p是一个指向具有3个int型元素的数组的指针。简称数组指针。

p+1的结果:为了更好地回答这个问题,我们来看如下定义:

int *r;

r = a;

r是一个指向int型元素的指针。

r+1我们都可以知道就是数组a[1]的地址。数组a的每个元素都是占四个字节的int型。这四个字节被编译器看作一个整体。r+1的具体算法如下:r+1 = r + sizeof(int)。

此时我们来看一下p+1:注意上面出现的两句话:

p是一个指向具有3个int型元素的数组的指针。

r是一个指向int型元素的指针。

r+1时编译器会把int里四个自己看作一个整体,p+1编译器也会把int里的四个自己看作一个整体。但是p是一个指向具有3个int型元素的数组的指针,所以p+1 = p + (sizeof(int))*3。

即p+1指向了a[3]的地址。

&a+1 = p+1 = &(a+3)

*(&a+1) = *(p+1) = &a[3];

 (&a+1)-&a = p+1-p = 1;

*(&a+1) - a = &a[3] - &a[0] = 3.

最后一个就不用我分析了。

我在这里还想说一点,就是关于对数组a取地址的用法:&a。其实这个程序的苦涩都是这个用法惹的祸。我认为编译器应该对这种用法加以限制。毕竟它是没法解释的。因为a是一个指针常量,我们是不能对常量取地址的。可是目前的编译器都对它放任.

希望对这个有研究的提点意见啊。谢谢了。

阅读(1313) | 评论(0) | 转发(0) |
0

上一篇:DNA Sorting

下一篇:个人简历

给主人留下些什么吧!~~