C/C+:二次ポインタ

5853 ワード

パラメータは実パラメータのコピーであり、パラメータの値を変更しても外部の実パラメータの値には影響しません.呼び出された関数の観点から,値伝達は一方向である(実パラメータ->パラメータ)
void ob_test(int a, char *name){
    a = 15;
    name = "ob";
}
int main(int argc, char * argv[]) {
    int a = 10;
    char *name = "jack";
    ob_test(a, name);
    NSLog(@"a = %d :name = %s",a,name);
    return 0;
}
 //  
 a = 10 :name = jack

main中のaとnameは変化しない.パラメータは実パラメータのコピーであり、ob_test中のaはmain関数中のaのコピーであるため、ob_test中のaを変化させ、main中のaの変化を引き起こさず、ob_test関数の終了時にコピーのaも破壊される.nameも同様で、main関数のnameはob_test関数のnameに使用されるようにコピーされ、ob_test関数のnameポインタを変更し、別のメモリを指すようにしたが、元のnameポインタは変更されなかった.
コードの変更
void ob_test(int *tmpa, char **tmpname){
    *tmpa = 15;
    *tmpname = "ob";
}
int main(int argc, char * argv[]) {
    int a = 10;
    char *name = "jack";
    ob_test(&a, &name);
    NSLog(@"a = %d :name = %s",a,name);
    return 0;
}

//  
a = 15 :name = ob

(int*)タイプのポインタtmpaは、変数&aのアドレスを受信する.&aのアドレスが0 x 005,644であれば、パラメータは実パラメータのコピーであるため、&aのアドレスは1部(0 x 005,644)コピーしてポインタtmpaに付与する.このとき、ポインタtmpaはアドレス0 x 005,644を指す.だからtmpaを変えるのは、このメモリの値を変えること、つまりaの値が変わることです.
同理char **tmpnameは、char *タイプのポインタを指すポインタを表す.ポインタを指すポインタです.tmpnameはnameポインタのアドレスを指す.したがって、*tmpnameを変更することは、変更されたnameポインタの指向である.つまり変わる