指向二维数组

时间:2012-03-31 13:10:59

标签: c++

我正在尝试编写一个指针指向二维数组的代码。

我的主要目的不仅仅是一个asd数组,就像我想点5个数组,每个数组都是2维。

int asd1[2][2];
int asd2[2][2];
int *se;
se[0] = asd1;
se[1] = asd2;

4 个答案:

答案 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;
}