関数でポインタの向きを変更します.
昨日データ構造を見た時、関数の中で指し方を変更する声明を見ました.
その役割は、p 1、p 2を並べ替えた後、p 3を新たに並べ替えられたシーケンスに指します.この時自分で感じたのは全部ListPtrポインタを使ってもいいです.なぜ指針として定義されたのですか?
その後資料を調べた後、次のように説明します.
関数伝達は一般的に値によって伝達されます.つまり、伝達されたパラメータの値を変更する必要があるなら、その住所を伝えなければなりません.
通俗的な例を紹介します.
まず、関数のパラメータはchar*pです.***pを変えることができますが、p自体は変えられません.
分かりやすいということは、pを変えましたが、関数の一部変数pが変わりました.関数が終わると、局部pが解放されました.実は、メイン関数pのコピーだけです.
変えたいなら、上に書いた方法を使って、二次元の指針を伝達します.例を修正してください.e.g:
二次元が抽象的すぎると感じたら、関数で値を返します.
- typedef struct List
- {
- int data;
- List *next;
- }sqList,*ListPtr;
void ChangePtr(ListPtr p 1,ListPtr p 2,ListPtr*p 3)その役割は、p 1、p 2を並べ替えた後、p 3を新たに並べ替えられたシーケンスに指します.この時自分で感じたのは全部ListPtrポインタを使ってもいいです.なぜ指針として定義されたのですか?
その後資料を調べた後、次のように説明します.
関数伝達は一般的に値によって伝達されます.つまり、伝達されたパラメータの値を変更する必要があるなら、その住所を伝えなければなりません.
- void modify(int i)
- {
- i = 5;
- }
- int main()
- {
- int i = 0;
- modify(&i);
- }
したがって、値を伝えるかどうかは、変数です.関数で値を変更するには、そのアドレスを伝えます.e.g:&i、ListPtr*p 3(それは住所の住所です.)通俗的な例を紹介します.
- char na[10] = "world"
- void modify(char *p)
- {
- p = na;
- }
- int main()
- {
- char *p = NULL;
- modify(p);
- printf("%s",p);// , world.
- }
私たちは関数modify()でポインタpの値を変えたいです.覚えておきたいのです.pが指すアドレスの値ではなく、ポインタpの値です.叶えられますか結果はできません.なぜですか?私たちは分析してみます.まず、関数のパラメータはchar*pです.***pを変えることができますが、p自体は変えられません.
分かりやすいということは、pを変えましたが、関数の一部変数pが変わりました.関数が終わると、局部pが解放されました.実は、メイン関数pのコピーだけです.
変えたいなら、上に書いた方法を使って、二次元の指針を伝達します.例を修正してください.e.g:
- void modify(char **p)
- {
- *p = na;
- }
- int main()
- {
- char *p = NULL;
- modify(&p);
- printf("%s",p)// world 。
- }
ゆっくり考えてもいいです.ほほほ、他の方法でもいいです.一緒に書きましょう.二次元が抽象的すぎると感じたら、関数で値を返します.
- void modify(char *p)
- {
- p = na;
- return p;
- }
- int main()
- {
- char *p = NULL;
- p = modify(p);
- }
引用してもいいです.これは書きません.勉強するのは簡単ではありません.