20

我知道这个问题被问了很多,但我仍然不清楚如何访问这些结构。

我想创建一个指向结构数组的全局指针:

typdef struct test
{
    int obj1;
    int obj2;
} test_t;

extern test_t array_t1[1024];
extern test_t array_t2[1024];
extern test_t array_t3[1025];

extern test_t *test_array_ptr;

int main(void)
{
    test_array_ptr = array_t1;

    test_t new_struct = {0, 0};
    (*test_array_ptr)[0] = new_struct;
}

但它给了我警告。我应该如何访问特定的结构[]

同样,我应该如何创建结构类型的指针数组?test_t *_array_ptr[2];?

4

4 回答 4

24

您正在寻找的语法有点麻烦,但它看起来像这样:

// Declare test_array_ptr as pointer to array of test_t
test_t (*test_array_ptr)[];

然后你可以像这样使用它:

test_array_ptr = &array_t1;
(*test_array_ptr)[0] = new_struct;

为了使语法更容易理解,您可以使用typedef

// Declare test_array as typedef of "array of test_t"
typedef test_t test_array[];
...
// Declare test_array_ptr as pointer to test_array
test_array *test_array_ptr = &array_t1;
(*test_array_ptr)[0] = new_struct;

cdecl实用程序对于破译复杂的 C 声明很有用,尤其是在涉及数组和函数指针时。

于 2013-04-24T20:50:02.387 回答
5

test_t * test_array_ptr是指向 的指针test_t。它可以是指向 的单个实例的指针test_t,但也可以是指向 的实例数组的第一个元素的指针test_t

test_t array1[1024];

test_t *myArray;
myArray= &array1[0];

thismyArray指向第一个元素,array1指针算术也允许您将此指针视为数组。现在您可以访问这样的第二个元素array1myArray[1],它等于*(myArray + 1).

但据我了解,您实际上想要在这里做的是声明一个指向指针的指针,test_t该指针将表示一个指向数组的指针数组:

test_t array1[1024];
test_t array2[1024];
test_t array3[1025];

test_t **arrayPtr;
arrayPtr = malloc(3 * sizeof(test_t*));   // array of 3 pointers
arrayPtr[0] = &array1[0];
arrayPtr[1] = &array2[0];
arrayPtr[2] = &array3[0];
于 2013-04-24T20:42:18.440 回答
0

您遇到的问题是您正在采用(*test_array_pointer)哪个是数组的第一个元素。如果要分配给数组的特定元素,您可以执行以下操作...

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    memcpy( &test_array_ptr[0], &new_struct, sizeof( struct test_t ) );
}

如果您想始终分配给数组的第一个元素,您可以这样做......

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    memcpy( test_array_ptr, &new_struct, sizeof( struct test_t ) );
}

并且已经被其他人指出来,而我真的完全忘记了因为在永远的大部分时间里没有使用它,你可以在 C 中直接分配简单的结构......

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    test_array_ptr[0] = new_struct;
}
于 2013-04-24T20:35:50.253 回答
0

我会使用指向如下指针的指针:

test_t array_t1[1024];
test_t **ptr;
ptr = array_t1;
ptr[0] = ...;
ptr[1] = ...;
etc.
于 2014-04-14T16:38:33.817 回答