0

私はこのプログラムについて本当に途方に暮れています.5つの要素の整数配列のアドレスを返したいのですが.しかし、うまくいきません.C関数が配列のアドレスではなく配列のアドレスを返すようにする方法最初の要素(ベースアドレス)?私は両方が数値的に同じであることを知っていますが、それらのタイプは異なります,それが私が尋ねる理由です.

また、正確に言えば、そのような関数のプロトタイプを宣言する方法は? (抽象宣言子を使用して) プロトタイプの引数部分を宣言する方法は理解していますが、アドレスを返す場合の戻り値の型を宣言する方法がわかりません。宣言で関数名の前に「*」を配置すると、関数がint、char、floatなどのそれぞれのプライマリデータ型へのポインターを返すことを意味することだけを知っています。

    #include<stdio.h>

    int (*)[5]fun(int (*)[5]);

    int main(void)
    {

    int arr[5];

    printf("%u",fun(&arr));

    }

    int (*)[5]fun(int (*arr_add)[5])
    {
    return arr_add;
    }

こんにちは!! DANIEL FISCHERご回答ありがとうございます。正確かつ簡潔に回答してくださいました。しかし、H2CO3 の回答を選択しました。なぜなら、あの優秀なハンガリーの子供がチャットで詳しく説明してくれたからです。最高のものを選ぶのは本当に難しいです。非常に多くの明るい人が答えているときに答えてください。みんなありがとう!!

4

3 に答える 3

5

おそらく、それがどのように機能するかを説明することは、ある程度役立つでしょう。

C の宣言構文の背後にある考え方は、「宣言は使用を模倣する」というものです。あなたが望んでいるのは

  • 機能

    fun( )
    
  • 5 の配列へのポインターを取得するint

    fun(int (*arr)[5])  // or without argument name fun(int(*)[5])
    
  • ポインタを返す

    (*fun(int (*arr)[5]))
    
  • 5つの配列に

    (*fun(int (*arr)[5]))[5]
    
  • int

    int (*fun(int (*arr)[5]))[5];
    

または、結果から移動することもできます。これは、5 の配列へのポインターである必要がありますint

int (*result)[5];

result呼び出し ( result = fun(arr))に置き換えます。

int (*fur(arr))[5];

次に、引数の型を追加するか、引数をその型に置き換えます。

int (*fun(int(*)[5]))[5];
于 2013-04-13T09:11:03.570 に答える
2

はい、どうぞ:

int (*fun(int (*arr)[5]))[5]
{
    return arr;
}

(配列自体のアドレスではなく)最初の要素のアドレスを返したい場合は、別の型です。

int *fun(int (*arr)[5])
{
    return &(*arr)[0];
}
于 2013-04-13T08:25:43.100 に答える
1

これは間違っています:

printf("%u",fun(&arr));

それは本当にあるべきです:

printf("%p", (void*)fun(&arr));

配列のアドレスに関しては、最初の要素のアドレスと同じになります。

これで、宣言と定義は次のようになります。

int (*fun(int(*)[5]))[5];

固定コード:

#include<stdio.h>

int (*fun(int (*)[5]))[5];

int main(void)
{
    int arr[5];

    printf("%p\n", (void*)fun(&arr));
}

int (*fun(int (*arr_add)[5]))[5]
{
    return arr_add;
}

イデオン

于 2013-04-13T08:22:00.863 に答える