获取指向二维数组的指针

时间:2017-10-31 22:05:18

标签: c pointers multidimensional-array

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

//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数组的简单指针。

3 个答案:

答案 0 :(得分:2)

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

}

答案 1 :(得分:0)

喜欢这个

//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;
    }
}

答案 2 :(得分:0)

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

因此,如果c是整数类型的2D数组,那么我们可以认为c是指向整数的指针,该整数可以解释为int ** c。解除引用* c为您提供行0或c [0]的地址,它是指向整数的指针,再次解引用c [0]为您提供2D数组的第一个元素,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;
}