考虑这个程序:
#include <stdio.h>
int main()
{
double *dp;
double **dpp;
dpp=&dp;
dp++;
dpp++;
return 0;
}
假设dp
的地址为100,dpp
的地址为1000。
增量后这些指针的地址是什么?
答案 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;
添加以上两行以更好地理解您的代码(只是其中之一)。