我需要一个指向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数组的简单指针。
答案 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;
}