web-dev-qa-db-ja.com

c構造体の配列へのポインター

私はこの質問が頻繁に聞かれたことを知っていますが、構造体にアクセスする方法はまだわかりません。

構造体の配列へのグローバルポインターを作成します。

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];

16
user1539348

探している構文はやや面倒ですが、次のようになります。

// 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宣言を解読するのに役立ちます。

17
Adam Rosenfield

_test_t * test_array_ptr_は_test_t_へのポインターです。 _test_t_の単一インスタンスへのポインターである場合もありますが、_test_t_のインスタンスの配列の最初の要素へのポインターである場合もあります。

_test_t array1[1024];

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

これにより、myArrayが_array1_の最初の要素を指すようになり、ポインター演算により、このポインターも配列として扱うことができます。これで、_array1_の2番目の要素にアクセスできます:_myArray[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];
_
5
LihO

あなたが持っている問題は、あなたが(*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;
}
0
K Scott Piel

次のようなポインターへのポインターを使用します。

test_t array_t1[1024];
test_t **ptr;
ptr = array_t1;
ptr[0] = ...;
ptr[1] = ...;
etc.
0
Sheldon Juncker