web-dev-qa-db-ja.com

Cの関数に文字列を渡す-ポインターの有無にかかわらず?

文字列を関数に渡すとき、時々使用します

char *functionname(char *string name[256])

そして時々私はポインターなしでそれを使用します(たとえば:

char functionname(char string[256])

私の質問は、いつポインターを使用する必要があるのですか?多くの場合、ポインターなしでプログラムを作成して動作しますが、動作しない場合もあります。

21
Zen Cicevic

C文字列を関数に渡すために受け入れられている規則は、ポインターを使用することです。

void function(char* name)

関数が文字列を変更するときは、長さも渡す必要があります。

void function(char* name, size_t name_length)

最初の例:

char *functionname(char *string name[256])

必要なものではない文字列へのポインタの配列を渡します。

2番目の例:

char functionname(char string[256])

文字の配列を渡します。ここでの配列のサイズは重要ではなく、パラメーターはとにかくポインターに減衰するため、これは次と同等です。

char functionname(char *string)

Cの配列引数の詳細については、 この質問 も参照してください。

38
Adam Zalcman

あなたが書くつもりだったと仮定して

char *functionname(char *string[256])

ここでは、charへの256個のポインターの配列を引数として受け取り、charへのポインターを返す関数を宣言しています。一方、ここでは、

char functionname(char string[256])

256 charsの配列を引数として受け取り、charを返す関数を宣言しています。

つまり、最初の関数は文字列の配列を受け取って文字列を返し、2番目の関数は文字列を受け取って文字を返します。

2
Nicola Musatti

配列はポインターです。 「オブジェクト」のシーケンスの開始点を指します。

ìnt arr[10];の場合、arrはメモリ位置へのポインタであり、そこから10個の整数が続きます。それらは初期化されていませんが、メモリは割り当てられています。 int *arr = new int[10];を実行するのとまったく同じです。

0
Anickyan