【问题标题】:How to use pointer-to-pointer's variables?如何使用指针到指针的变量?
【发布时间】:2018-06-16 09:49:00
【问题描述】:

我正在尝试这段代码:

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 这里有什么区别?

EDIT2:

为什么是结果

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

与以下结果相同:

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

【问题讨论】:

  • 你知道z[1][1]是什么类型吗?如果是,为什么您认为允许在前面添加两个“星”?
  • @UnholySheep:谢谢!我明白了!
  • @UnholySheep:但为什么*w[0]*z[0] 有相同的结果仍然令人困惑?事实上我现在无法真正想象z的结构!
  • **z[0] 取消引用 3 次,这就是你的 cout 不起作用的原因。
  • 让我们回顾一下:*x 是 x[0] 的另一种写法,所以 **z 就像 z[0][0]。

标签: c++ element pointer-to-pointer


【解决方案1】:

为什么z[1][1] 有效?

z 是指向int 数组中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 的实际第二个int,在您的情况下为@ 987654344@;

为什么**z[1][1] 不起作用?

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

为什么*w[1] 有效?

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

为什么*w[1]的结果和*z[1]的结果一样?

让我们想象一下:

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

数组w 是由两个指向int 的指针组成的数组,它们是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

【讨论】:

  • 非常感谢!但是您能否详细解释一下*(*(z + 0) + 0)z+0z+1 的确切含义是什么?什么是z在这一点上你+1呢?我认为z 是一个地址,您通过+1 进入下一个地址。
  • 我还在之前的问题中添加了一个新问题(编辑 2),这对我来说很模糊!
  • @Hasani 我添加了一些可视化。恐怕之后如果您还有任何问题,您将不得不发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-05-18
  • 1970-01-01
  • 2010-11-11
  • 2011-08-04
  • 1970-01-01
  • 2020-04-13
相关资源
最近更新 更多