関数でポインタの向きを変更します.


昨日データ構造を見た時、関数の中で指し方を変更する声明を見ました.
 

  
  
  
  
  1. typedef struct List 
  2.     int data; 
  3.     List *next; 
  4. }sqList,*ListPtr; 
void ChangePtr(ListPtr p 1,ListPtr p 2,ListPtr*p 3)
その役割は、p 1、p 2を並べ替えた後、p 3を新たに並べ替えられたシーケンスに指します.この時自分で感じたのは全部ListPtrポインタを使ってもいいです.なぜ指針として定義されたのですか?
 
その後資料を調べた後、次のように説明します.
関数伝達は一般的に値によって伝達されます.つまり、伝達されたパラメータの値を変更する必要があるなら、その住所を伝えなければなりません.
 

  
  
  
  
  1. void modify(int i) 
  2.     i = 5
  3. int main() 
  4.     int i = 0
  5.     modify(&i); 
したがって、値を伝えるかどうかは、変数です.関数で値を変更するには、そのアドレスを伝えます.e.g:&i、ListPtr*p 3(それは住所の住所です.)
通俗的な例を紹介します.
 

  
  
  
  
  1. char na[10] = "world" 
  2. void modify(char *p) 
  3.     p = na; 
  4. int main() 
  5.     char *p = NULL; 
  6.     modify(p); 
  7. printf("%s",p);// , world.
私たちは関数modify()でポインタpの値を変えたいです.覚えておきたいのです.pが指すアドレスの値ではなく、ポインタpの値です.叶えられますか結果はできません.なぜですか?私たちは分析してみます.
まず、関数のパラメータはchar*pです.***pを変えることができますが、p自体は変えられません.
分かりやすいということは、pを変えましたが、関数の一部変数pが変わりました.関数が終わると、局部pが解放されました.実は、メイン関数pのコピーだけです.
変えたいなら、上に書いた方法を使って、二次元の指針を伝達します.例を修正してください.e.g:
 

  
  
  
  
  1. void modify(char **p) 
  2.     *p = na; 
  3. int main() 
  4.     char *p = NULL; 
  5.     modify(&p); 
  6.     printf("%s",p)// world 。 
ゆっくり考えてもいいです.ほほほ、他の方法でもいいです.一緒に書きましょう.
二次元が抽象的すぎると感じたら、関数で値を返します.
 

  
  
  
  
  1. void modify(char *p) 
  2.     p = na; 
  3.     return p; 
  4. int main() 
  5.     char *p = NULL; 
  6.     p = modify(p); 
引用してもいいです.これは書きません.勉強するのは簡単ではありません.