[英]Pointer arithmetic with pointer to pointer to double
我试图了解执行此操作时会发生什么
#include <stdio.h>
const int MAX = 3;
int main () {
//double var[] = {10.0, 100.1, 200.2};
double var[3];
int i;
double *ptr;
double **ptr2;
for(i=0;i<MAX;i++)var[i] = 10.0*(double)(i+1);
/* let us have array address in pointer */
ptr = var;
ptr2 = &ptr;
for ( i = 0; i < MAX; i++) {
printf("Address of var[%d] = %x\n", i, *ptr2 );
printf("Value of var[%d] = %f\n", i, **ptr2 );
/* move to the next location */
ptr2++;
}
return 0;
}
此代码段在第二次迭代中给出了段错误
Address of var[0] = b0e04370
Value of var[0] = 10.000000
Address of var[1] = 0
但是,如果我们不调用ptr2
而是调用ptr
这将起作用
for ( i = 0; i < MAX; i++) {
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %f\n", i, *ptr );
/* move to the next location */
ptr++;
}
给
Address of var[0] = 3e9e89a0
Value of var[0] = 10.000000
Address of var[1] = 3e9e89a8
Value of var[1] = 20.000000
Address of var[2] = 3e9e89b0
Value of var[2] = 30.000000
之所以会出现段错误,是因为下一个地址实际上没有容纳任何内容。
我将循环更改为此,现在它可以按您期望的方式工作:
/* let us have array address in pointer */
ptr = var;
ptr2 = &ptr;
for (i = 0; i < MAX; i++)
{
printf("Address of var[%d] = 0x%x\n", i, (void*)*ptr2 );
printf("Value of var[%d] = %f -- using ptr\n", i, *ptr);
printf("Value of var[%d] = %f -- using ptr2\n", i, **ptr2);
ptr++;
// This updates ptr2, which was missed out
ptr2 = &ptr;
}
以此打印以下内容:
Address of var[0] = a313c9b0
Value of var[0] = 10.000000 -- using ptr
Value of var[0] = 10.000000 -- using ptr2
Address of var[1] = a313c9b8
Value of var[1] = 20.000000 -- using ptr
Value of var[1] = 20.000000 -- using ptr2
Address of var[2] = a313c9c0
Value of var[2] = 30.000000 -- using ptr
Value of var[2] = 30.000000 -- using ptr2
您的代码在第二次迭代(而不是第一次)中出现段错误的原因是
ptr = var;
ptr2 = &ptr;
在这两行中,当ptr
指向var[0]
, ptr2
不保存ptr
的地址。
现在让我们看一下更新后的代码的第二次迭代:
ptr++;
这使ptr
指向var[1]
ptr2 = &ptr;
这使ptr2
保留ptr
的地址,该地址现在指向var[1]
。
我想这可以解释。 也许您可以自己尝试第三次迭代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.