代码之家  ›  专栏  ›  技术社区  ›  Hasani

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

  •  3
  • Hasani  · 技术社区  · 7 年前

    我正在尝试以下代码:

    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]);
    无法<<*w[0];
    

    与以下结果相同:

    printf("%d", *z[1]);
    cout<<*z[0];
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Killzone Kid    7 年前

    为什么? 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 (见上文) 在你的例子中。所以当你试图取消引用 int ,更不用说两次了?一个错误!

    为什么? *w[1] 作品?

    W 是指针数组。用 w[1] 从数组中得到第二个指针,它指向2的数组 int S {3,6} . 如果你取消引用,你将得到第一个 int 在你的情况下 3 .

    为什么结果是 *W〔1〕 与结果相同 *z[1] ?

    让我们想象一下:

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

    数组 W 是2个指针的数组 int 这些都是 w[0] W〔1〕 . W〔1〕 是指向 int 在那个阵型里。这个 int 它指向是 . Z 是指向指针的指针 int ,或者在本例中指向 W [ 0 ] ,这是指向 . z[1] *(z+1) 它使 Z 在解引用结果之前指向下一个指针,在本例中是 W〔1〕 ,它指向 . 取消对两者的引用 W〔1〕 Z〔1〕 产生相同的结果,因为它们最终都指向相同的 int ,这就是 .