在知道尺寸之前,我可以声明一个指向二维数组的指针吗?

时间:2015-10-14 16:52:02

标签: c arrays pointers

我知道声明指向二维数组的指针的一种方法是这样的:

int(*p)[100];

然后在分配给某些东西后,我可以使用这样的元素:

p[1][6] = 18;

但是,让我们说我还不知道阵列的尺寸,当我发现时,我打算将它们封存起来。

一个解决方案是我声明一个只指向int的指针,然后使用指针算法来导航数组。我通常这样做,但这次我想方便使用方括号表示法。

那么当我还不知道尺寸并且打算使用方括号表示法时,如何声明这个指针呢?

4 个答案:

答案 0 :(得分:3)

  

那么当我还不知道尺寸并且打算使用方括号表示法时,如何声明这个指针呢?

您可以使用指向指针的指针。

int** p = NULL;

以后......

p = malloc(N*sizeof(int*));
for (int i = 0; i < N; ++i )
{
   p[i] = malloc(M*sizeof(int));
}

并确保以多个步骤解除分配。

for (int i = 0; i < N; ++i )
{
   free(p[i]);
}
free(p);

另一种方式。

// Allocate memory for the pointers.
p = malloc(N*sizeof(int*));

// Allocate memory for the ints.
p[0] = malloc(M*N*sizeof(int));

// Assign the values to the elements of p.
for (int i = 1; i < N; ++i )
{
   p[i] = p[i-1] + M;
}

并且只需两步即可解除分配。

free(p[0]);
free(p);

答案 1 :(得分:1)

只需使用指向可变长度数组的指针。

你的尺码,y行有x个元素:

size_t x = 123;
size_t y = 30;

通过一次通话分配,sizeof(*p)sizeof(int) * 123相同:

int (*p)[x] = malloc( sizeof(*p) * y );

迭代2d数组:

for( size_t i = 0 ; i < y ; i++ )
    for( size_t j = 0 ; j < x ; j++ )  
        p[i][j] = 0;

答案 2 :(得分:0)

int(*p)[100];

这不是你想要的。这是指向int数组的指针。

你想要的是指向int的指针。

int **p;
p=malloc(sizeof(int *)*r);       // allocate memory for r number of int *
for(int i=0;i<r;i++)
    p[i]=malloc(sizeof(int)*c);  //  allocate memory to each pointer  

free以类似的方式。

答案 3 :(得分:-1)

要索引数组数组而不是指针数组,可以使用此技巧:

#include <stdlib.h>
#include <stdio.h>

void f( const size_t m, const size_t n, const char s[m][n] )
{
   printf( "%s, %s!\n", s[0], s[1] );
   return;
}

int main(void) {
    static const char hello[][6] = { "hello", "world" };
    f( sizeof(hello)/sizeof(hello[0]), sizeof(hello[0]), hello );

    return EXIT_SUCCESS;
}

您的问题标记为C而不是C ++,但C ++确实引用了数组:int (&foo)[m][n] = bar;