C語言中的地址傳遞(傳指針,傳遞給形參的指針仍然是實參指針的一份拷貝)


 

先看一個例子:這個程序為什么會崩潰?

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int f(int *q)
 5 {
 6     int a = 10;
 7     q = (int*)malloc(sizeof(int));
 8     *q = a;
 9     return 0;
10 }
11 
12 int main()
13 {
14     
15     int *p = NULL;
16     f(p);
17     printf("%d", *p);
18     return 0;
19 }

此處的q任然是p的一個拷貝,可以通過這個程序證明:

 1 #include <iostream>
 2 
 3 
 4 int f(int *q)
 5 {
 6     std::cout << &q << std::endl;
 7     return 0;
 8 }
 9 
10 int main()
11 {
12     int a = 10;
13     int *p = &a;
14     f(p);
15     std::cout <<  &p;
16     return 0;
17 }

輸出為:   ,    說明指針p與指針q的地址是不同的,證明q是p的一個拷貝。

 

所以第一個程序崩潰的原因:函數中的q其實是實參p的一份拷貝,函數中的操作都是對q進行的,p仍然是NULL,所以輸出*p的值產生崩潰!

 

 

可以把形參改為二級指針,程序便可以按預想中的情形進行:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int f(int **q)
 5 {
 6     int a = 10;
 7     *q = (int*)malloc(sizeof(int));
 8     **q = a;
 9     return 0;
10 }
11 
12 int main()
13 {
14 
15     int *p = NULL;
16     f(&p);
17     printf("%d", *p);
18     return 0;
19 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM