0

我想知道是否有可能通过有条件地取消引用不同的指针层,直到到达不是指针的层,才能到达 C 中 n 维数组的最低级别(非指针级别),如下例所示:

if(i_is_a_pointer){
  for(i = 0; i < some_given_length; i++){
    if((*i)_is_a_pointer){
      for(j = 0; j < some_given_length; j++){
        if((**i)_is_a_pointer)...etc.
      }
    }
  }
}

这将深入研究数组,直到它碰到一个非指针或用尽最后编写的代码块。在 C 语言中,如何确定事物是否是指针(如果目标非指针的大小与内存地址的大小不同,我猜想 sizeof 会起作用),并且语句 **i 会是如果 *i 本身不是指针,编译时或运行时错误?

此外,您使用/推荐哪些语言和技术来遍历 n 维数组的非数组元素,其中 n 是在运行时确定的?

4

1 回答 1

4

正如您似乎推断的那样,C 中的多维数组不是指针嵌套,直到您到达最终级别。它们只是数据块。在某些情况下,外部尺寸会自动转换为指针:数组转换为指向其第一个元素的指针。例如,

int a[3][4][5];

也可以写

typedef int INNER[5];    // array of 5 ints
typedef INNER MIDDLE[4]; // array of 5 INNERs (not pointers)
typedef MIDDLE OUTER[3]; // array of 3 MIDDLEs (not pointers)
OUTER a;

那么这些也是数组的等价指针转换。

MIDDLE *pm = a;
INNER *pi = a[0];
int *p = a[0][0];

int (*pm)[4][5] = a;
int (*pi)[5] = a[0];
int *p = a[0][0];

最后,由于 C 是静态类型的,因此无法或不需要在运行时分析类型,就像您尝试使用if语句一样。在已编译的 C 程序中,基本上没有剩余的类型信息。

于 2012-06-15T19:48:54.047 回答