C++ 指向二维数组

C++ 指向二维数组,c++,C++,我试图编写一个指向二维数组的指针 我的主要目的不仅仅是为了一个asd阵列,我想指出5个阵列,每个阵列都是二维的 int asd1[2][2]; int asd2[2][2]; int *se; se[0] = asd1; se[1] = asd2; 使用se=asd[0] 原因是符号asd产生的不是指向int的指针,而是指向一维int数组的指针 @米格的解决方案可能也不错。这取决于你想要什么。根据我的经验,如果将int这样的基本类型的二维数组当作长度为n*n的一维数组来处理,效果会更好。(在数

我试图编写一个指向二维数组的指针

我的主要目的不仅仅是为了一个asd阵列,我想指出5个阵列,每个阵列都是二维的

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

使用
se=asd[0]

原因是符号
asd
产生的不是指向int的指针,而是指向一维int数组的指针


@米格的解决方案可能也不错。这取决于你想要什么。根据我的经验,如果将int这样的基本类型的二维数组当作长度为n*n的一维数组来处理,效果会更好。(在数值计算中尤其如此,你可能会调用BLAS和LAPACK,但在其他地方也可能如此。你可能不在这里做数值计算,但是,好吧,试试@Mig's和mine,看看你不喜欢哪个。祝你好运。)

如果你在动态分配该数组,你可以这样做:

#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)[2] = asd;
现在,您应该能够:

se[0][1] = 10;

你想要这样的东西:

#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)[2] = asd;
这相当于

int (*se)[2] = &asd[0];
因为
asd
在该上下文中衰减为指向其第一个元素的指针

需要记住的关键是
asd[0]
的类型是
int[2]
,而不是
int*
,因此您需要指向
int[2]
(即
int(*)的指针,而不是指向
int*
(即
int**
)的指针

顺便说一句,如果愿意,可以将
int*
指向
asd[0]
的第一个元素:

int *p = &asd[0][0]; // or just = asd[0];, because it decays to &asd[0][0];
但是,像访问一维数组一样访问二维数组的其他元素,例如
p[2]
,将是未定义的行为


作为一个更一般的观点,如果您可以帮助的话,通常最好避免使用原始的C样式数组。根据需要,您可能需要调查
std::array
std::vector

您可以这样做:

#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;
}
#包括
int main()
{
int asd[2][2]={{0,1},{2,3};
int(*se)[2];//指向两个整数数组[2]的数组(2元素数组,但只有您知道,而不是编译器)的指针(*se)
se=自闭症;
printf(“%d%d\n%d%d\n”,se[0][0],se[0][1],se[1][0],se[1][1]);
返回0;
}
或:

#包括
int main()
{
int asd[2][2]={{0,1},{2,3};
int(*se)[2][2];//指向int的两元素数组(第二个[2])的两元素数组(第一个[2])的指针(*se)
se=&asd;
printf(“%d%d\n%d%d\n”)、(*se[0][0]、(*se[0][1]、(*se[1][0]、(*se[1][1]);
返回0;
}

你在谷歌上搜索过“将2d数组作为参数传递”吗?没有。那不行
asd
[[int,int],[int,int]]
没有指针,只有元素,
se[n][m]
需要
[int*,int*,…]指向“sub'-array”的指针你不能等同于se=asd,这是我的想法problem@Mig问题是C++的问题——你可以使用<代码> Malc C < /C>和<代码>免费> />代码,它非常的C风格和复古。一个更为通用的C++方式将涉及使用<代码> STD::vector < /C> >(即,甚至不<代码>新< /COD>和 Dele> <代码>。array@StuartGolodetzOOOPS,忘记了C++标签。