charへのトリプルポインターのアドレスの取得

c pointers
charへのトリプルポインターのアドレスの取得

gcc 4.4.4 c89

なぜ別のメモリアドレスを取得するのか疑問に思っています。 メインの動物の住所を印刷すると、次のようになります。

animals [ rabbit ] : [ 0xbfab2e48 ]
animals [ rabbit ] : [ 0xbfab2e48 ]

ただし、関数で印刷すると、異なるメモリロケーションが取得されます。 それらは同じであるべきだと思います。

ptr animals [ rabbit ] : [ 0xbfab2e08 ]
ptr animals [ rabbit ] : [ 0xbfab2e08 ]

アドバイスをありがとう

int main(void)
{
    char *animals[] = {"rabbit", "cat", "dog", "elephant", "racoon", NULL};
    char *countries[] = {"india", "amercia", "france", "spain", "canada", "mexico", NULL};
    char *cars[] = {"ford fista", "Masda 3", "honda city", "toyata cote", NULL};
    char **ptr_data[] = {animals, countries, cars, NULL};

    printf("animals [ %s ] : [ %p ]\n", *animals, (void*)animals);
    printf("animals [ %s ] : [ %p ]\n", animals[0], &animals[0]);

    print_data_ptr(ptr_data);

    return 0;
}

void print_data_ptr(char ***ptr)
{
    char **data_list = NULL;

    printf("ptr animals [ %s ] : [ %p ]\n", *ptr[0], (void*)&ptr[0]);
    printf("ptr animals [ %s ] : [ %p ]\n", **ptr, (void*)ptr);
}

  0  0


ベストアンサー

「動物」は「char 」値の配列であり、「ptr_data」は「char *」値の配列です。

この行で `ptr_data`を初期化するとき:

char **ptr_data[] = {animals, countries, cars, NULL};

animals`はその最初の要素へのポインタとして評価されます-したがって、 ptr_data [0] &animals [0] と同じです- animals`の最初の char *`のアドレス。 mainの2つの `printf()`関数で同じことが起こります-`animals`と&animals [0] は同じことを評価します。これは ptr_data [0] `に保存されたポインタ値でもあります。

関数内で、 ptr`はmainの ptr_data`の最初の要素へのポインターです。したがって、 ptr`は&ptr_data [0] と同等です。 `&ptr [0]`は `ptr`と完全に同等です。したがって、&ptr [0] は、そこに格納されているものではなく、 ptr_data [0] `のアドレスを表示します。 代わりに `ptr [0]`を印刷すると、 `animals [0]`のアドレスが取得されます。

4


タイトルとURLをコピーしました