在C:n维数组中取消引用非指针

时间:2012-06-15 19:45:01

标签: c arrays pointers n-dimensional

我想知道是否有可能通过有条件地解除引用不同的指针层来达到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本身不是指针,则编译时或运行时错误?

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

1 个答案:

答案 0 :(得分: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程序中,几乎没有剩余的类型信息。