我正在尝试这段代码:
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
之间的区别是什么?
EDIT2:
为什么是
的结果printf("%d", *w[1]);
cout<<*w[0];
与以下结果相同:
printf("%d", *z[1]);
cout<<*z[0];
答案 0 :(得分:2)
为什么
z[1][1]
有效?
z
是指向int
数组中w
指针的指针。解除引用*z
将为您指向int
中的第一个{1,5}
,并再次将其解除**z
将int
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
的第二个指针。它指向的3
是z
。 int
是指向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();
}
}
。