2017-04-09 40 views
0

我有一个1D数组已被动态分配,我想指向一个双指针(** ptr),然后将ptr当作一个二维数组,但为此,应该设置二维数组的宽度,有没有办法做到这一点。例如,如果我有一个尺寸为80的阵列,我想将其视为一个8 * 10的2D阵列,这样((ptr)+1)将移动10个单位。我知道我可以手动使用它作为arr [i row + j],但我宁愿以另一种方式做它。谢谢你的帮助!!!如何在c中设置指针的宽度?

+1

'输入a [80];类型(* b)[10] =(类型(*)[10])a;'使用'b [i] [j]'。 – BLUEPIXY

+0

我可以使用col等变量替换10吗? (感谢答案btw)。 –

+2

在这个问题中,术语'宽度'和'双'是不明确的。在C语言环境中,它们通常被理解为具有不同于此处所设想的含义。在这个问题中你可能很清楚你的意思,但标题本身就是误导。 – Clifford

回答

3

重新解释一个一维数组作为使用指针二维数组:

Type a[80]; 
Type (*b)[10] = (Type (*)[10])a;//or simply (void*)a. b is pointer to Type[10] 

使用b[i][j]

注: 双指针(等作为**ptr)基本上是错误。通常,该数组不是指针数组。

另外int col = 10; Type (*b)[col] = (Type (*)[col])a;作为VLA(可变长度阵列)自C99(c11的选项)以来可能。

+0

[DEMO](http://ideone.com/w2Lrcm) – BLUEPIXY

1

除了TYPE*对象之外,您从不指向TYPE**。您没有任何TYPE*对象。一组TYPE不是其中之一。除了之外,您还可以分配TYPE*的数组,并且将前者的每个元素排列为指向后者的相关元素。

TYPE* elements = malloc (N_rows * N_cols * sizeof(TYPE)); 
TYPE** rows = malloc (N_rows * sizeof(TYPE*)); 
for (i = 0; i < N_rows; ++i) 
    rows[i] = elements + N_cols * i; 

然而,这是非常低效和不方便的。如果其中一个维度是编译时常量,或者您可以使用VLA,则可以在不使用任何双引用的情况下执行此操作(详细信息请参阅其他答案,以便我不再重复)。

相关问题