程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 用雙重指針做參數傳遞

用雙重指針做參數傳遞

編輯:關於C

今天話了點時間想了一下用雙重指針做參數傳遞的問題,以前一直只知道用,沒有細想過為什麼,今天正好有點xian。  
#include"stdio.h"

void fun(char * pa)
{
    printf("pa的值:%d\n",pa);
    pa = "bb";
    printf("pa的值:%d\n",pa);
}

int main(void)
{
     char * p = 0;
     printf("p的值:%d\n",p);
     fun(p);

     if(p != 0)
     {
          printf("改變後輸出p = ");
          puts(p)
     }
     else
     {
          printf("p值未改變!\n");
     }
    
     return 0;
}

結果輸出"p值未改變!",分析一下不難理解:給fun函數傳參的時候,其實應該是有一個隱形的操作pa=p ,這個操作和普通的兩個變量賦值是一樣的,把p的值賦給了pa,
然後,我們通過打印出來的值可以看到,在fun裡面,pa的值原本是p的地址的,但是,pa在fun裡面指向了“bb”,這樣,問題就出來了,pa的值確實改變了,指向也變了,
但是,我們想要改變的p的值仍舊是”0“。
後來,我發現,p的值沒有改變是因為pa改變的是他自己的值,沒有改變他的指向的地址的值,但在這個例子裡面作為參數的p初始化是0,也就是NULL,如果進行*pa = 'b'
這樣的操作的話是非法的。    為了使操作成功,我給p賦了初值”aa“,然後進行這個操作發現仍舊不成功。原來,因為計算機的內存主要是分為:棧區、堆區、靜態區、只讀
區,其中,棧區,分配的是局部變量空間,比如是函數的調用,局部變量,需要執行的代碼等等一些不需要我們手動分配和釋放的內存;堆區,是向上增長的,主要是分配程序員申請的空間;靜態分區,分配的是靜態變量、全局變量;只讀分區,分配的是常量和代碼空間。    所以,這個操作才會失敗。。

現在,來總結一些:首先,我們需要的結果是通過傳遞一個指針,來改變這個指針的指向的值,上面那個例子裡面,傳遞的僅僅是一個地址值,因此,在下面的例子裡面,我們需要傳遞的是一個完整的指針變量,我把這個指針變量的地址傳進去,這就是我理解的二重指針做參數:
#include"stdio.h"

void fun(char ** pa)
{
    printf("pa的值:%d\n",pa);
    *pa = "bb";
    printf("pa的值:%d\n",pa);
}

int main(void)
{
     char * p = 0;
     printf("p的值:%d\n",p);
     fun(&p);

     if(p != 0)
     {
          printf("改變後輸出*p = ");
          puts(p);
     }
     else
     {
          printf("p值未改變!\n");
     }
    
     return 0;
}

OK,把指針p的地址作為參數傳遞給fun函數,pa=&p;*pa="bb";這樣就可以p的值就變成"bb"在只讀區的地址了。。。
高手勿噴。。。。有錯歡迎指正!
高手勿噴。。。。有錯歡迎指正!
高手勿噴。。。。有錯歡迎指正!

謝謝!

 

摘自 門牙將軍
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved