双指针如何从单个指针获取值

How a double pointer fetch the value from a single poiner

数组现在由单个指针指向。双指针指向单指针。我正在尝试使用这个双指针获取数组的值。到目前为止,我只通过双指针获取了数组的第一个索引值。 我知道,如果我取消引用(*ptr2)一个双指针,那么它将给出第一个指针指向的地址(ptr1),这意味着数组的第一个索引地址(&array[0] ).

#include <iostream>
using namespace std;

int main(){
    int array[5]{15,25,35,45,55};
    int* ptr1;
    int** ptr2;

    ptr1 = &array[0];
    ptr2 = &ptr1;

在下面的for循环中,我尝试使用指针ptr1打印array的值。

    for(int i =0; i<5; i++){
        cout<<"the value: "<<*(ptr1+i)<<" lives at "<<ptr1+i<<" address\n";
    }
    cout<<"\n";

在下面的 for 循环中,我尝试检查 *ptr2 是否一直给我提供由 ptr1 指向的地址。但我发现第一个索引只有 works/same 然后它是 (*ptr2) 给我一个不同的地址

    for(int j=0; j<5; j++){
        cout<<"adress of array: "<<&array[j]<<" , ptr1: "<<(ptr1+j)<<" , val of ptr2: "<<*(ptr2+j)<<endl;
    }

    cout<<"\n";
    return 0;
}

虽然我尝试使用 **ptr2+i 使用 for 循环从 ptr2 获取值,但它只持续了 2 次。第一次正确的值很明显,因为我看到 array[0]*(ptr2+0) 的地址相同。第二次垃圾值然后Segmentation fault (core dumped).

我想到了一个猜测,ptr1ptr2 都是 int 类型,但一个指向变量,另一个指向指针。所以也许有一个内存分配概念从一开始就出现了,我被跳过了。

有什么方法可以使用上述结构获取数组的值吗?

ptr2 指向 ptr1(ptr2+j),当 j 不是 0 时,是您尚未分配的地址,因此取消引用它 (*(ptr2+j)) 使您的程序具有 undefined behavior 并获得分段错误 是一种可能的结果。

您应该先取消引用它,然后索引:(*ptr2)[j]*((*ptr2)+j) 如果您愿意的话。

你的推理很接近,但你没有很好地应用它。

I know that if I dereference (*ptr2) a double pointer then it will give the address where the first pointer is pointed (ptr1)

换句话说,*ptr2ptr1 的同义词。所以任何你看到 ptr1 的地方(在分配 ptr2 = &ptr1 之后)你都可以替换为 *ptr2。更好的是,替换为 (*ptr2) 以避免来自优先级高于 de-reference 的运算符的干扰。举个例子:

   for(int i =0; i<5; i++){
       cout<<"the value: "<<*(ptr1+i)<<" lives at "<<ptr1+i<<" address\n";
   }
   cout<<"\n";

现在做一个简单的find-and-replace。将 ptr1 替换为 (*ptr2)。不要试图调整任何东西;一旦你决定这样做,这个过程就很简单了。

    for(int i =0; i<5; i++){
        cout<<"the value: "<<*((*ptr2)+i)<<" lives at "<<(*ptr2)+i<<" address\n";
    }
    cout<<"\n";

这几乎就是您在循环中尝试的方法,只是您使用了 *(ptr2+j) 而不是 (*ptr2)+i。我们可以忽略从 ij 的变化,但这些括号很重要。您更改了操作顺序,这相当于使用 3(1+4) 而不是 (3×1)+415 在需要 7 的地方不起作用也就不足为奇了,同样地,在 de-referencing 之前添加 j 在 de-reference 需要的地方不起作用先完成。

注意:由于 de-reference 的优先级高于加法,因此可以从此特定示例中删除 *ptr2 周围的括号。也就是说,*ptr2+i*(*ptr2+i) 也可以。

注意:这个问题可以证明为什么避免 pointers-to-pointer.

通常是明智的