gpt4 book ai didi

c - 指针算术,指针指向 double

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:40 25 4
gpt4 key购买 nike

我想了解执行此操作时会发生什么

#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

然而,如果我们调用 ptr 而不是调用 ptr2,这会起作用

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;

在这两行中,ptr2 不保存 ptr 的地址,而 ptr 指向 var[0]

现在让我们看看更新后的代码的第二次迭代:

ptr++;

这使得 ptr 指向 var[1]

ptr2 = &ptr;

这使得 ptr2 保存 ptr 的地址,现在指向 var[1]
我想这解释了。也许您可以自己尝试第三次迭代。

关于c - 指针算术,指针指向 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com