指针p+1为什么没有指向第二个结构成员?

定义一般基本变量时,内存地址:按照定义变量的顺序从高到低。

结构成员初始化后, 其内存地址的规律是:从低位到高位连续排列。

并且类似于数组,它的第一个成员的内存地址也就是这个结构变量的内存位置。(但是你并不能通过这个地址调取这个成员的值,必须使用类似: (*p).member 的形式才可以。因为.的优先级高于*所以用了括号, 当然还可以写成更酷炫的 : p->member)

对于数组来说,如果p指针指向数组的起始位置(0号位置),那么p+1就指向了它的1号位置。并且,更重要的一点就是,p本身就是这个数组,因为创建这个指针的时候不需要 & 运算符,只需要类似:  int* p = matrix 。

但是对于结构来说,首先需要 & 运算符来获取结构的地址传给指针变量,然后*p的值就是第一个成员的值。但是*(p+1)却不是第二个成员的值。我用的代码如下:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    struct date {
        int month;
        int day;
        int year;
    };

    struct date today = {12, 26, 2014};

    struct date* p = &today;

    printf("%p\n", &*p);
    printf("%p\n", &*(p+1));
    printf("%p\n", &*(p+2));
    return 0;
}

/*结果:
0x7fff42d9e4c0
0x7fff42d9e4cc
0x7fff42d9e4d8

*/

经过测试, p+1 指向的地址总是比 p 指向的地址大12. 即使我定义的结构里面全部是 int 类型,也不是我设想的相差4个地址。改变结构成员的数量,经过多次测试,我发现:

p+1 的地址指向的不是下一个结构成员,而是下一个结构。因为12 = 4 * 3,我正好定义了三个结构成员。所以这一点也是和数组很不一样的。

总的来说,结构的性质表现得更像 int , char 之类的类型。

除了这个指针运算的特点相似之外,结构和 int 等还有一个相似之处,那么就是在传入函数后不会改变原值,而是改变的副本。数组则会被函数改变。

 

posted @ 2014-12-26 20:29  谭哥  阅读(2260)  评论(0编辑  收藏  举报