我正在尝试编写一个指针指向二维数组的代码。
我的主要目的不仅仅是一个asd数组,就像我想点5个数组,每个数组都是2维。
int asd1[2][2];
int asd2[2][2];
int *se;
se[0] = asd1;
se[1] = asd2;
答案 0 :(得分:0)
使用se = asd[0];
原因是符号asd
不是指向int的指针,而是指向一维整数数组的指针。
@ Mig的解决方案也可能很好。这取决于你想要什么。根据我的经验,当您将基本类型的二维数组(如 int )视为一维长度 n * n时,它往往效果更好。(在数字工作中尤其如此,你可能会称之为BLAS和LAPACK,但在其他地方可能也是如此。你可能不会在这里做数值工作,但是,好吧,试试@ Mig和我的两个,祝你好运。祝你好运。)
答案 1 :(得分:0)
如果您动态分配该数组,则可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main() {
int i;
int **asd;
asd = (int **)malloc(sizeof(int *) * SIZE);
for (i = 0; i < SIZE; i++) {
asd[i] = (int*)malloc(sizeof(int) * SIZE);
}
int **se;
se = asd;
se[0][1] = 10;
printf("%d %d\n", se[0][1], asd[0][1]);
for (i = 0; i < SIZE; i++) {
free(asd[i]);
}
free(asd);
return 0;
}
编辑:我的第一个答案是错的,这就是我所说的:
你需要一个指向指针的指针,因为你的数组是二维的:
int asd[2][2];
int **se;
se = asd;
现在你应该能够:
se[0][1] = 10;
答案 2 :(得分:0)
你想要这样的东西:
int asd[2][2];
int (*se)[2] = asd;
这相当于
int (*se)[2] = &asd[0];
因为asd
衰变到指向此上下文中第一个元素的指针。
要记住的关键是asd[0]
的类型是int[2]
,而不是int*
,所以你需要一个指向int[2]
的指针(即{{ 1}})而不是指向int (*)[2]
的指针(即int*
)。
顺便提一下,如果您愿意,可以int**
指向int*
的第一个元素:
asd[0]
但是访问2D阵列的其他元素就好像它是一维数组一样,例如int *p = &asd[0][0]; // or just = asd[0];, because it decays to &asd[0][0];
,将是未定义的行为。
作为一个更普遍的观点,如果你可以帮助它,通常最好避免使用原始C风格的数组。您可能需要调查p[2]
或std::array
,具体取决于您的需求。
答案 3 :(得分:0)
你可以这样做:
#include<stdio.h>
int main()
{
int asd[2][2] = {{0,1},{2,3}};
int (*se)[2]; // a pointer (*se) to an array (2-element array, but only you know it, not the compiler) of array-of-two-integers [2]
se = asd;
printf("%d %d\n%d %d\n", se[0][0], se[0][1], se[1][0], se[1][1]);
return 0;
}
或:
#include<stdio.h>
int main()
{
int asd[2][2] = {{0,1},{2,3}};
int (*se)[2][2]; // a pointer (*se) to a 2-element array (first [2]) of two element array (second [2]) of ints
se = &asd;
printf("%d %d\n%d %d\n", (*se)[0][0], (*se)[0][1], (*se)[1][0], (*se)[1][1]);
return 0;
}