【问题标题】:Getting a pointer to a 2d Array获取指向二维数组的指针
【发布时间】:2017-10-31 22:05:18
【问题描述】:

我需要一个指向二维数组的指针。如果有帮助,大小在编译时是已知的。我需要根据变量的传入值对某个数组执行操作。

//Global arrays
// int c[6000][1000];
// int a[6000][1000];

void fun(int x){

    //Setup a pointer here
    //Possible solution: int (*pointer)[6000][1000];
    int **pointer;
    if (x == 0){
         pointer = c;
    }
    else{
         pointer = a;
    }
    //Modify pointer here and have changes reflect back to the array it was based off of
    pointer[0][17] = 42;
}

我已经查看了近十篇关于如何执行此操作的不同堆栈溢出文章,但我无法找到一种方法来获取指向 2D 数组的简单指针。

【问题讨论】:

  • A **pointer 与二维数组不同,尽管它可以以相同的方式进行索引。
  • @WeatherVane 我将如何访问指针的元素(指向常规二维数组)?这可能很容易做到吗?谢谢
  • @xing 我想你想说的是一维数组。我已经为 2D 数组 int **pointer = c1; printf("%d\n", *(*(pointer + 0) + 0)); 尝试过类似的东西,但是这个 seg 错误。
  • 正如xing所说,就int (*pointer)[1000] = x ? a : c;
  • 看看this

标签: c pointers multidimensional-array


【解决方案1】:
//Global arrays
int c[6000][1000];
int a[6000][1000];

void fun(int x) {
 int  (* ptr)[1000];
  if (x == 0) {
    ptr = c;
   } else {
    ptr = a;
   }
   ptr[0][17] = 42;

}

【讨论】:

    【解决方案2】:

    像这样

    //Global arrays
    int c[6000][1000];
    int a[6000][1000];
    
    void fun(int x) {
        if (x == 0) {
            c[0][17] = 42;
        } else {
            a[0][17] = 42;
        }
    }
    

    【讨论】:

    • 解决了这个问题。实际上,我对数组有相当多的了解,并且不想复制所有代码。我只是提供了一个我正在尝试做的例子。
    • 那么请发布一个更现实的问题。
    • 我不确定有什么不清楚的地方。我想完全按照我在我的问题中发布的那样做。我想要一个指向二维数组的指针。指针指向一个全局二维数组,但它在 if 语句中设置。
    【解决方案3】:

    使用指针访问二维数组: 二维数组是一维数组的数组,这意味着二维数组的每一行都是一维数组。所以,想想你的两个全局数组, 整数 c[6000][1000] 和整数 a[6000][1000]。 我们可以说 c[0] 是第一个全局二维数组的第 0 行的地址。类似地,a[6000] 是第二个全局二维数组的第 6000 行的地址。 现在你想找到 c[0][17] 并使用一个基本上是 c[0][17] = *(c[0] + 17) 的指针指向它。 您也可以为任何其他数组元素编写 c[0] = *c 并且通常每个元素为 c[i][j] = *(c[i] + j) = ( (c+i) + j)。

    所以,如果 c 是一个整数类型的二维数组,那么我们可以认为 c 是一个指向整数的指针,它可以解释为 int **c。取消引用 *c 为您提供第 0 行或 c[0] 的地址,它是指向整数的指针,再次取消引用 c[0] 为您提供二维数组的第一个元素 c[0][0],它是一个整数. 您可以通过使用指针访问每个元素来测试您的代码,以便更好地理解:

    #include<stdio.h>
    #include<stdlib.h>
    
    //Global arrays
    int c[6000][1000];
    int a[6000][1000];
    
    void fun(int x){
        //Setup a pointer here
        //Possible solution: int (*pointer)[6000][1000];
        int (*pointer)[1000];
        if (x == 0){
             pointer = c;
        }
        else{
             pointer = a;
        }
        //Modify pointer here and have changes reflect back to the array it was based off of
        pointer[0][17] = 42;
    }
    
    int main(){
        int num;
        scanf("%d", &num);
        fun(num);
        if(num == 0){
            printf("When num is %d, c[0][17] = %d\n", num, *(*(c) + 17));
        }
        else{
            printf("When num is %d, a[0][17] = %d\n", num, *(a[0] + 17));
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2012-01-26
      相关资源
      最近更新 更多