双指针如何从单个指针获取值
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).
我想到了一个猜测,ptr1
和 ptr2
都是 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
)
换句话说,*ptr2
是 ptr1
的同义词。所以任何你看到 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
。我们可以忽略从 i
到 j
的变化,但这些括号很重要。您更改了操作顺序,这相当于使用 3(1+4)
而不是 (3×1)+4
。 15
在需要 7
的地方不起作用也就不足为奇了,同样地,在 de-referencing 之前添加 j
在 de-reference 需要的地方不起作用先完成。
注意:由于 de-reference 的优先级高于加法,因此可以从此特定示例中删除 *ptr2
周围的括号。也就是说,*ptr2+i
和 *(*ptr2+i)
也可以。
注意:这个问题可以证明为什么避免 pointers-to-pointer.
通常是明智的
数组现在由单个指针指向。双指针指向单指针。我正在尝试使用这个双指针获取数组的值。到目前为止,我只通过双指针获取了数组的第一个索引值。
我知道,如果我取消引用(*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).
我想到了一个猜测,ptr1
和 ptr2
都是 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
)
换句话说,*ptr2
是 ptr1
的同义词。所以任何你看到 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
。我们可以忽略从 i
到 j
的变化,但这些括号很重要。您更改了操作顺序,这相当于使用 3(1+4)
而不是 (3×1)+4
。 15
在需要 7
的地方不起作用也就不足为奇了,同样地,在 de-referencing 之前添加 j
在 de-reference 需要的地方不起作用先完成。
注意:由于 de-reference 的优先级高于加法,因此可以从此特定示例中删除 *ptr2
周围的括号。也就是说,*ptr2+i
和 *(*ptr2+i)
也可以。
注意:这个问题可以证明为什么避免 pointers-to-pointer.
通常是明智的