従来の swap 関数では、2 つのポインターを渡すと、ポインターが指す値が入れ替わります。ただし、この単純な関数では
int leng (char *a)
{
int n;
for (n=0; *a!='\0'; a++)
n++;
return n;
}
関数が呼び出された後も、ポインタは配列の最後の要素ではなく最初の要素を指しています。何故ですか?スワップ機能との違いは?
従来の swap 関数では、2 つのポインターを渡すと、ポインターが指す値が入れ替わります。ただし、この単純な関数では
int leng (char *a)
{
int n;
for (n=0; *a!='\0'; a++)
n++;
return n;
}
関数が呼び出された後も、ポインタは配列の最後の要素ではなく最初の要素を指しています。何故ですか?スワップ機能との違いは?
ポインタはそれ自体がオブジェクトです。この場合、ポインターを参照ではなく値で渡すため、ポインター自体への変更は関数の外部に反映されません。関数内でポインターが指すオブジェクトを変更した場合、それらの変更は関数の外部で持続します。
試す:
int leng (char** a)
{
int n;
for (n=0; **a!='\0'; (*a)++)
n++;
return n;
}
leng(&pointer);
ポインタを値で渡しています。ポインタ値は、関数呼び出し中にスタックにコピーされます。そのスタック変数をインクリメントしていますが、関数が戻るとスタック変数はなくなります。
swap
これは実際には関数と同じです。このswap
関数では、ポイントされている値を変更できますが、ポインター自体を変更することはできません。同様に、を指すleng
文字列内の文字を変更できますが、それ自体への変更(別の配列要素を指すように変更)は、呼び出し元には表示されません。a
a
これを変更したい場合は、次のように記述してください。
int leng (char **a)
{
int n;
for (n=0; **a!='\0'; *a++)
n++;
return n;
}
へのポインタを a
渡します。
通常のポインタだけでなく、ポインタからポインタへのポインタが必要になる場合があります。(ポインター自体は値によって渡されます。渡されたポインターのコピーの値を変更します)。