C/C+:二次ポインタ
5853 ワード
パラメータは実パラメータのコピーであり、パラメータの値を変更しても外部の実パラメータの値には影響しません.呼び出された関数の観点から,値伝達は一方向である(実パラメータ->パラメータ)
main中のaとnameは変化しない.パラメータは実パラメータのコピーであり、
コードの変更
(int*)タイプのポインタtmpaは、変数&aのアドレスを受信する.&aのアドレスが0 x 005,644であれば、パラメータは実パラメータのコピーであるため、&aのアドレスは1部(0 x 005,644)コピーしてポインタtmpaに付与する.このとき、ポインタtmpaはアドレス0 x 005,644を指す.だからtmpaを変えるのは、このメモリの値を変えること、つまりaの値が変わることです.
同理
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ポインタの指向である.つまり変わる