2017-09-25 9 views
0

文字へのポインタを引数として受け取り、整数の配列へのポインタを返す関数のCコードは何でしょうか?配列へのポインタを返す関数のC言語ステートメントは何ですか?

私はここで混乱しています。私の答えは次のとおりです。

int * q (char *) [ ] 

私が正しいかどうかわかりません。しかし、それが間違っていれば正解はもっと重要なのですが、それに答える方法は何ですか?一般的に、私はそのような質問を解釈してCコードに変換することを学ぶための一般的な方法に感謝しますか?

+0

持つことが可能です:関数は常に固定サイズのバッファへのポインタを返すことですが、その場合には、私は読みやすくするためのtypedefを使用することをお勧めします場合は、時々ディメンションを指定することは有用であろう(固定サイズの)配列へのポインタですが、特定の多次元配列のコンテキストでは大抵便利です。ダイナミックに割り当てられたメモリへのポインタを返すか? –

+0

'int * q(char *){ここに関数の内容を挿入}}は正しいです。他に何を知りたいですか? –

+0

[q as関数へのポインタ(charへのポインタ)intへのポインタの配列を返す](https://cdecl.org/?q = int + * + q +%28char + *%29 +%5B +%5D) – chux

答えて

1

関数を扱う場合、基本的に配列をポインタと見なす必要があります。可能であれば、関数内で配列を渡したり返すのは非常に難しく、sizeofオペレータなどの操作を意図したとおりに動作させることができます。

このように返された配列の長さを知ることはできませんが、int ** q (char *)で十分です。

0

私はあなたの混乱がどこにあるかを見て、あなたが選択した答えに基づいてクリアされているかどうかはわかりません。 int **q (char *)は、それはあなたが必要なものであれば、それは大丈夫である、をintへのポインタではなく、理解するのポインタを返す関数で、関数はをint型へのポインタにのポインタを返すことができる唯一の方法は、(あればです1)配列のアドレス(配列へのポインタ)がqへのパラメータとして渡されるか、または(2)qにポインタが割り当てられ、ポインタが割り当てポインタに返されます。

(1)が欲しいと思われますが、(2)の回答が選択されています。 cdecl.org (C-declarations tool)をご覧ください。宣言の解読に常に役立ちます。

これを整理するのに最適な方法はおそらくそれぞれの例です。次の例は、文字変数cのASCII値(ASCII '5'、デフォルトでは十進数53)で再生されます。最初のケースでは、ポインタをintにする(0以上の整数を保持するメモリブロックへのポインタ)を返します。例えば、ここではメモリのブロックが53-105からの値で埋め53整数を保持するために割り当てられている:

#include <stdio.h> 
#include <stdlib.h> 

int *q (char *c) 
{ 
    int *a = calloc (*c, sizeof *a); 

    if (a) 
     for (int i = 0; i < (int)*c; i++) 
      a[i] = *c + i; 

    return a; 
} 

int main (int argc, char **argv) { 

    char c = argc > 1 ? *argv[1] : '5'; 
    int *array = NULL; 

    if ((array = q (&c))) 
     for (int i = 0; i < (int)c; i++) 
      printf ("array[%3d] : %d\n", i, array[i]); 

    free (array); /* don't forget to free mem */ 

    return 0; 
} 

今すぐ後者の場合には、あなたが戻ってきているへのポインタへのポインタint型( A 0以上を保持しているメモリブロックへのポインタintへのポインタ - 各ポインタは0以上の整数を保持するために別々に割り当てられます。この場合、個々の各ポインタは、一つintを保持するための空間が割り当てられていると、上記のように同じ値が割り当てられている各場合において

#include <stdio.h> 
#include <stdlib.h> 

int **q (char *c) 
{ 
    int **a = calloc (*c, sizeof *a); /* allocate *c pointers to int */ 

    if (a) { 
     for (int i = 0; i < (int)*c; i++) 
      if ((a[i] = calloc (1, sizeof **a))) /* alloc 1 int per-pointer */ 
       *(a[i]) = *c + i; 
      else { 
       fprintf (stderr, "error: memory exhausted.\n"); 
       break; 
      } 
    } 

    return a; 
} 

int main (int argc, char **argv) { 

    char c = argc > 1 ? *argv[1] : '5'; 
    int **array = NULL; 

    if ((array = q (&c))) 
     for (int i = 0; i < (int)c; i++) { 
      printf ("array[%3d] : %d\n", i, *(array[i])); 
      free (array[i]); /* free individually allocated blocks */ 
     } 
    free (array); /* don't forget to free pointers */ 

    return 0; 
} 

使用例/出力

を、引数が渡されていない場合このプログラムは、デフォルトの出力は次のようになります。

$ ./bin/qfunction2 
array[ 0] : 53 
array[ 1] : 54 
array[ 2] : 55 
... 
array[ 50] : 103 
array[ 51] : 104 
array[ 52] : 105 

今、あなたが返される整数の配列へのポインタをしたい説明するように見えるとして、あなたが後にある2例どの全く不明です。私の前回の回答では、の配列を返すことはできません。返すことができるのはポインタですが、そのポインタは複数の整数を保持できるメモリのブロックを指すことができます。複数の整数を保持するために割り振られた複数のポインタを保持するメモリ。

ので、曖昧さで来る「あなたは、整数またはポインタの配列の配列へのポイントへの復帰をしたいですか?」 int *q (char *)は最初のもの、int **q (char*)は2番目のものです。

次に、返される整数(またはポインタ)の数を知る方法を提供していないことがわかります。 (それは余分なパラメータやグローバル変数を必要とする(落胆する)必要があります)。それは別の日のために残されます。 (例がASCII値53の演劇であるか、または最初の引数の最初の文字である文字は、割り当てられたものを知るための固定値を提供する)

私は提供していますさらに助けますが、私はあなたが達成しようとしていることについて少し明確にする必要があります。角括弧内寸を有するように任意である

int (*p)[]; 

+0

これは関数へのポインタを持っています。それは私が考えている質問ごとに必要ではありません – Midhun

+0

あなたは正しいです。私はあなたが 'int *'を返す関数へのポインタを必要としていることをなぜ読んだのか分かりません。私の悪い。 –

0

整数の配列へのポインタのように見えます。

だからそれを返す関数は次のようになります。「配列へのポインタ」は「配列の最初の要素へのポインタ」に別物であることを

int (*func(char *))[]; 

注意。時には、人々は後者を意味するとき、前者を言う。あなたが実際に後者の意味なら、あなたの関数は、より簡単かもしれない:

int **func(char *); 

とにかくint **にそれを減衰以外の戻り値にできることは何もないので、最初の形はほとんど使用されません。

typedef int ARR_4_INT[4]; 

ARR_4_INT * func(char *); 
関連する問題