如何使用指向指针的变量?
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];
这里的w
和z
有什么区别?
编辑 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 int
s,{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
的第二个指针。它指向的int
是3
。 z
是指向 int
的指针,或者在本例中是指向 w[0]
的指针,后者是指向 1
的指针。 z[1]
与 *(z+1)
相同,它使 z
指向解引用结果之前的下一个指针,在本例中为 w[1]
,指向 3
.取消引用 w[1]
和 z[1]
会产生相同的结果,因为最终它们都指向相同的 int
,即 3
.
我正在尝试这段代码:
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];
这里的w
和z
有什么区别?
编辑 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 int
s,{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
的第二个指针。它指向的int
是3
。 z
是指向 int
的指针,或者在本例中是指向 w[0]
的指针,后者是指向 1
的指针。 z[1]
与 *(z+1)
相同,它使 z
指向解引用结果之前的下一个指针,在本例中为 w[1]
,指向 3
.取消引用 w[1]
和 z[1]
会产生相同的结果,因为最终它们都指向相同的 int
,即 3
.