如何使用指向指针的变量?

How to use pointer-to-pointer's variables?

我正在尝试这段代码:

int x[] = {1,5};
int y[] = {3,6};
int *w[] = {x,y};
int **z = w;


printf("%d", **z[1]);
cout<<**z[0];

但是没用。我的目标是访问 x 或 y 数组中的每个元素。我的问题来自这部分真正的 OpenCV 代码:

float h_ranges[] = {0, 180}; 
float s_ranges[] = {0, 256};
const float* ranges[] = {h_ranges, s_ranges};

想知道如何读取 ranges[] 中的每个元素?

编辑:我试过了:

printf("%d", z[1][1]);
cout<<z[0][0];

它奏效了,但我很想知道为什么

printf("%d", **z[1][1]);
cout<<**z[0][1];

不起作用,但以下代码有效

printf("%d", *w[1]);
cout<<*w[0];

这里的wz有什么区别?

编辑 2:

为什么

的结果
printf("%d", *w[1]);
cout<<*w[0];

与以下结果相同:

printf("%d", *z[1]);
cout<<*z[0];

Why z[1][1] works?

z 是指向 w 数组中 int 的指针。取消引用 *z 会给你指向 {1,5} 中第一个 int 的指针,再次取消引用它 **z 会给你 int,即 1.这与 z[0][0]*(*(z + 0) + 0) 相同。

z[1][1] 等同于 *(*(z + 1) + 1)。取消引用 *(z + 1) 将为您提供指向第二个数组 {3,6} 中第一个 int 的指针。递增 *(z + 1) + 1 将为您提供指向第二个数组 {3,6} 中第二个 int 的指针,解引用 *(*(z + 1) + 1) 将为您提供第二个数组的实际第二个 int {3,6},在您的情况下是 6

Why **z[1][1] doesn't work?

使用 z[1][1] 会给你一个 int(见上文),在你的例子中是 6。那么,当您尝试取消引用 int 时会发生什么,更不用说两次了?一个错误!

Why *w[1] works?

w 是指针数组。使用 w[1],您可以从该数组中获得第二个指针,该指针指向 2 ints,{3,6} 的数组。如果取消引用它,您将获得该数组的第一个 int,在您的情况下是 3.

Why the result of *w[1] is same as the result of *z[1]?

让我们想象一下:

{1,5} {3,6}
 |     |
{w[0], w[1]}
 |     | 
 z     z+1

数组 w 是指向 int 的 2 个指针的数组,它们是 w[0]w[1]w[1] 是该数组中指向 int 的第二个指针。它指向的int3z 是指向 int 的指针,或者在本例中是指向 w[0] 的指针,后者是指向 1 的指针。 z[1]*(z+1) 相同,它使 z 指向解引用结果之前的下一个指针,在本例中为 w[1],指向 3.取消引用 w[1]z[1] 会产生相同的结果,因为最终它们都指向相同的 int,即 3.