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

时间:2018-06-16 09:49:01

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

我正在尝试这段代码:

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];

1 个答案:

答案 0 :(得分:2)

  

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

z是指向int数组中w指针的指针。解除引用*z将为您指向int中的第一个{1,5},并再次将其解除**zint 1,即z[0][0] }。这与执行*(*(z + 0) + 0)z[1][1]相同。

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

  

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

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

  

为什么w有效?

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

  

为什么*z[1]的结果与{1,5} {3,6} | | {w[0], w[1]} | | z z+1 的结果相同?

让我们想象一下:

w

数组int是指向w[0]的2个指针数组,分别为w[1]w[1]int是该数组中int的第二个指针。它指向的3zint是指向w[0]的指针,或者在这种情况下是指向1的指针,指向z[1]的指针。 *(z+1)z相同,它使w[1]在解除引用结果之前指向下一个指针,在本例中为3,指向w[1] }。取消引用z[1]int会产生相同的结果,因为最终它们都指向相同的3,即package engine.graphics; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RadialGradientPaint; import java.awt.geom.Point2D; import engine.Main; import engine.maths.Vector2f; public class Light { private Vector2f pos; private int radius; public Light(Vector2f pos, int radius) { this.pos = pos; this.radius = radius; } public void render(Graphics g) { Graphics2D g2d = (Graphics2D)g; Point2D center = new Point2D.Float(pos.x, pos.y); float[] dist = {0.9f, 1.0f}; Color[] color = {new Color(0.0f, 0.0f, 0.0f, 0.1f), new Color(0, 0, 0, 255)}; RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, color); g2d.setPaint(p); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .95f)); g2d.fillRect(0, 0, Main.WIDTH, Main.HEIGHT); g2d.dispose(); } }