0

以下の回答に基づいて更新されたコードと、反映された警告/問題

C でポインターの配列をコーディングしようとしています。ループで値を設定し、別のループで値を取得します。かなり簡単です。これらの値を設定しようとしている方法は次のとおりです。

static int  *toInvert[8];
for (i=0; i<8; i++)
{
              int *intrplated = //Function call that returns int*
              toInvert[i] = intrplated;
              //printf("OL Value = %d\n\n\n\n\n",oLoop);
}

値を取得するために、ループなしのコードを次に示します。つまり、固定値を取得します。

int *tmpPtr = toInvert[3]; 
printf( "*(TPointer + %d) : %d\n\n", 3, *(toInvert[3] + 1)); //Still gives the recently added value

setter値を出力しようとすると、ループで最後に追加された値のみが出力されます。tmpPtr を に変更してtoInvert[1]も、最後に設定された値が取得されます。

しかし、記述された for ループ内で同じコードを実行すると、期待どおりに動作します。

設定されたすべての値を取得する方法を知る必要があります。ありがとう

編集 私が欲しいのは、8つのポインターを含む8つの要素の配列です。各ポインターは、3 つのプレーンな整数の配列を順番に指します。私が望む配列は、整数の配列を指す[p1][p2]...[p8]場所のようなものでなければなりません。[p1]

4

7 に答える 7

2

実装しようとしているのは、ポインタの配列ですよね?

#include <stdio.h>
#include <stdlib.h>
#define LIMIT 3

int main()
{
    int i,j;
    static int  *toInvert[LIMIT];
    int *intrplated;
    for (i=0; i<LIMIT; i++)
    {
        intrplated = malloc(sizeof(int)*5);
        intrplated[0] = rand();
        intrplated[1] = rand();
        intrplated[2] = rand();
        intrplated[3] = rand();
        intrplated[4] = rand();
        toInvert[i] = intrplated;
    }
    for (i=0;i<LIMIT;i++)
    {
        printf("Tpointer to toInvert[%d] contains::\t [",i);
        for(j=0;j<5;j++)
        {
            printf("%d ",toInvert[i][j]);
        }
        printf("]\n");
    }

    putchar('\n');
    for(j=0;j<5;j++)
    {
        printf("%d ",toInvert[1][j]);
    }
    putchar('\n');
    for(i=0;i<LIMIT;i++)
    {
        free(toInvert[i]);
    }
    return 0;
}

GCC 4.8.0 でコンパイル

編集:変更を参照してください。ポインターの配列は情報を保持します

出力:

Tpointer to toInvert[0] contains::       [41 18467 6334 26500 19169 ]
Tpointer to toInvert[1] contains::       [15724 11478 29358 26962 24464 ] 
Tpointer to toInvert[2] contains::       [5705 28145 23281 16827 9961 ]

15724 11478 29358 26962 24464
于 2013-04-26T18:56:22.413 に答える
1

全体に が多すぎます*

#include <stdlib.h>
#include <stdio.h>
int main() {

    static int  *toInvert[8];
    int i;
    for (i=0; i<8; i++)
    {
              int *intrplated = (int*) calloc(10, sizeof(int));
              toInvert[i] = intrplated;
              //printf("OL Value = %d\n\n\n\n\n",oLoop);
    }

    int *tmpPtr = toInvert[3];
    printf( "*(TPointer + %d) : %d\n\n", 3, *(tmpPtr + 1));

    return 0;
}

これは int の配列です。

int x[8];

これはintへのポインターの配列です。

int *x[8];
于 2013-04-26T18:48:51.563 に答える
1

ここで、int へのポインターへのポインターの配列を宣言しました。

static int  **toInvert[8];

a を削除し*て、代わりに int へのポインターの配列を取得します。次に、各反復intrplatedの代わりに割り当てます。はすでにポインターであるため、ポインターへのポインターです。すべてまとめて:&intrplatedintrplated&intrplated

static int *toInvert[8];
for (i=0; i<8; i++)
{
    int *intrplated = //Function call that returns int*
    toInvert[i] = intrplated;
}
于 2013-04-26T18:45:24.487 に答える
1

これは機能します。

static int  *toInvert[8];
for (i=0; i<8; i++)
{
          int *intrplated = //Function call that returns int*
          toInvert[i] = intrplated;
          //printf("OL Value = %d\n\n\n\n\n",oLoop);
}

あなたのコードでは、これ

    static int  **toInvert[8];

ポインターへのポインターの配列があることを意味します。

これ:

          int *intrplated = //Function call that returns int*
          toInvert[i] = intrplated;

間違っている。ローカル変数のアドレスをintrplatedポインターの配列に渡しています。

この

int *tmpPtr = *toInvert[3];
printf( "*(TPointer + %d) : %d\n\n", 3, *(tmpPtr + 1));

の宣言が間違っているため、あなたの場合はうまくいくかもしれませんが、間違っtoInvertています。混合ポインターと配列宣言の詳細については、こちらを参照してください。

于 2013-04-26T18:47:11.257 に答える
-1

& は必要ありません:

toInvert[i] = &intrplated;

正しい方法は次のとおりです。

toInvert[i] = &intrplated;

intrplated はすでに整数へのポインターであるため、ポインター自体 (本質的にはポインターへのポインター) ではなく、ポインターのアドレスを取得しています。

ポインタは、コンパイラがメモリの位置として扱う整数に似ているため、ポインタ自体もどこかに格納され、独自のアドレスもあることに注意してください。

これも:

static int  **toInvert[8];

ポインターのポインターではなく、ポインターの配列へのポインターです。あなたが実際に望んでいるのはこれだと思います:

static int  *toInvert[8];
于 2013-04-26T18:47:08.433 に答える
-1

このコード:

for (i=0; i<8; i++)
{
    toInvert[i] = &intrplated;
}

のすべての要素toInvertを のアドレスに設定していますintrplated。のどの要素をtoInvert見ても、同じアドレスを参照解除し、 に格納されている値を確認しintrplatedます。

また、forループが終了するとintrplated存在しなくなるため、配列内の値を逆参照するときに未定義の動作が発生します。

これは、関数によって返されたポインターを格納する場合に必要なものです。

for (i=0; i<8; i++)
{
    toInvert[i] = intrplated;
}

保存する場合は、次のようなint *配列が必要です。int *

int * toInvert[8];
于 2013-04-26T18:39:47.550 に答える
-1

関数呼び出しは、おそらくそれが返すポインターを上書きします。malloc を使用してこのポインターを割り当てる必要があり、使用後は解放する必要があります。

関数がポインタを返す場合も & を省略してください。

于 2013-04-26T18:42:06.913 に答える