2016-12-21 3 views
1

私は、char配列へのポインタを受け取る関数を持っています。この関数はポインタをインクリメントして、配列全体に渡ってn個の長さに渡るようにします。最後に、関数は特定の状態を示すintを返します。問題は、同じchar配列へのポインタも受け取る他の関数があり、別の関数が途切れた場所を正確に横断する必要があることです。だから私はどうにかしてポインタのアドレスを保存する必要があります。関数はintを返すので、ポインタを返すことはできません。私はまだ何とかこれをプルすることができますか、またはいくつかのデータ型(intとポインタアドレス)を保存するために構造体を使用する必要があるかどうか疑問に思っています。他の関数からポインタアドレスを保存する

ここでは、そのような機能の例です:

int func(char *p) { 
    while(*p != 's') 
     p++; 
    return (*p == 's') ? 1 : -1 
} 
+0

あなたがここにさまざまなオプションがあります。関数の署名は固定されていますか?それ以外の場合は、配列内の最後の位置、つまり各関数によって更新される別のポインタを含む各関数に2番目の引数を渡すことができます。 – wiredolphin

+0

署名は固定されていますが、複数の引数をどのように返しますか? – Yos

+0

この関数は1を返します。または返さない(おそらく、遅かれ早かれ未定義の動作になる)示されたコードは意味をなさない。 – alk

答えて

1

あなたはポインタを編集することができます:

// The ** means a pointer to a pointer, you can now edit the pointer. 
int func(char **p) { 
    // Mauybe check for the end of the string here as well. 
    while(*(*p) != 's') { 
     // We dereference our pointer and edit it here. 
     (*p)++; 
    } 
    return (*(*p) == 's') ? 1 : -1 
} 

この機能あなたのpの終わりにループが停止した位置にポイントします

は、ここで最初のオプションです。あなたはこのようにそれを呼び出します。関数のシグネチャはに固定されている

char *p = someString; 
int myInt = func(&p); 

場合、これは、この位置を「再発見」するために、グローバル、またはあなたの第二の機能で同じループを使用せずに可能ではありません。

+0

固定シグネチャとは、可変長の関数ではないということですか? – Yos

+0

@Yos関数を 'int func(char * p)'から他のものに変更できない場合は、 –

+0

魅力のように働いた、ありがとう。 – Yos

0

あなたは状態とポインタを含む構造体を返すことができるか、グローバルポインタ

+0

グローバルはオプションではありません – Yos

1

を作ることができ、私はあなたがダブルを使用する必要が怖いですポインタ。引数をchar **に変更することで、関数が非常に醜いか、char **型の新しい "out"引数を追加することで、ポインタのアドレスであるポインタが格納されます - 別の戻り値をシミュレートするソート。

int func(char **p) { 
    while (**p != 's') 
     ++*p; 
    return **p == 's' ? 1 : -1; 
} 
0

どのようにポインタへのポインタについて:

int func(char **p) { 
    while(**p != 's') 
     (*p)++; 
    return (**p == 's') ? 1 : -1; 
} 

あなたは使用してそれを呼び出します。

func(&pointer); 
+1

私はあなたが実際に元のポインタを変更しないp(not * p)をインクリメントしていると思います。 – Neme

+1

@ネーム私はそれを修正しました、ありがとう – MotKohn

関連する問題