我知道声明指向二维数组的指针的一种方法是这样的:
int(*p)[100];
然后在分配给某些东西后,我可以使用这样的元素:
p[1][6] = 18;
但是,让我们说我还不知道阵列的尺寸,当我发现时,我打算将它们封存起来。
一个解决方案是我声明一个只指向int的指针,然后使用指针算法来导航数组。我通常这样做,但这次我想方便使用方括号表示法。
那么当我还不知道尺寸并且打算使用方括号表示法时,如何声明这个指针呢?
答案 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;