增加指针

时间:2014-02-03 05:17:03

标签: c pointers

考虑这个程序:

#include <stdio.h>

int main()
{
    double *dp;
    double **dpp;

    dpp=&dp;

    dp++;
    dpp++;

   return 0;    
}

假设dp的地址为100,dpp的地址为1000。 增量后这些指针的地址是什么?

3 个答案:

答案 0 :(得分:3)

最简单的方法是让你的程序可编译并给它严格定义的行为,然后运行它。

#include <stdio.h>

int main(void)
{
    double   d[2]   = { 3.141593, 2.718128 };
    double  *dp     = &d[0];
    double  *dpa[2] = { &d[0], &d[1] };
    double **dpp    = dpa;

    printf("dp  = %p\n", (void *)dp);
    printf("dpp = %p\n", (void *)dpp);
    dp++;
    dpp++;
    printf("dp  = %p\n", (void *)dp);
    printf("dpp = %p\n", (void *)dpp);

    return 0;
}

请注意代码如何仔细确保指针始终指向有效数据。您可以扩展打印以打印*dpp(另一个指针)和**dpp*dp(两个都是双值)。

在我的机器上(Mac OS X 10.9.1,GCC 4.8.2,64位编译),输出为:

dp  = 0x7fff56945510
dpp = 0x7fff56945520
dp  = 0x7fff56945518
dpp = 0x7fff56945528

编译为32位时,输出为:

dp  = 0xbfffc600
dpp = 0xbfffc5f0
dp  = 0xbfffc608
dpp = 0xbfffc5f4

dp中的8跳是sizeof(double) == 8的结果(对于32位和64位编译)。 32位编译的dpp为4,而64位编译为8的变化是32位sizeof(double *) == 4和64位sizeof(double *) == 8的结果。

答案 1 :(得分:2)

dp++是未定义的行为,因为dp从未初始化。无法保证将会发生什么。

可能会发生什么,虽然依赖于此将是一个糟糕的决定,是dp的内存中的数值增加sizeof(double),并且数值dpp的值增加sizeof(double *)sizeof(double)可能是8,sizeof(double *)可能是4或8。

答案 2 :(得分:0)

double *dp =&gt;是指向double类型变量的指针(dp的大小仅为4个字节)

double **dp1 =&gt;是一个指向指针的指针,指向double(dp1的大小是4个字节)

指针的大小总是4个字节(假设是32位机器;在64位机器上,它是8个字节) 指针大小取决于内存地址的大小。

当你递增dp++时,你将指针指向double,其大小为8字节,因此它增加8个字节(100 => 108)。

当您将指针递增到指针时,其大小为4个字节,因此它仅增加4个字节(1000 =&gt; 1004)

指针增量取决于它指向的对象类型。

在您的代码中,您尚未直接声明double类型的变量;您已初始化**dp1,这将导致未定义的行为。

double a = 10.00;
dp = &a; 

添加以上两行以更好地理解您的代码(只是其中之一)。