小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

函數(shù)指針參數(shù)傳遞

 sun317 2012-11-06
1、數(shù)組作為函數(shù)參數(shù)
void fun(char a[10])
{
      int i = sizeof(a);
      char c = a[3];
}
        如果數(shù)組b 真正傳遞到函數(shù)內部,那i 的值應該為10。但是我們測試后發(fā)現(xiàn)i 的值竟然為4!為什么會這樣呢?難道數(shù)組b 真的沒有傳遞到函數(shù)內部?是的,確實沒有傳遞過去,這是因為這樣一條規(guī)則:C 語言中,當一維數(shù)組作為函數(shù)參數(shù)的時候,編譯器總是把它解析成一個指向其首元素首地址的指針。
         這么做是有原因的。在C 語言中,所有非數(shù)組形式的數(shù)據(jù)實參均以傳值形式(對實參做一份拷貝并傳遞給被調用的函數(shù),函數(shù)不能修改作為實參的實際變量的值,而只能修改傳遞給它的那份拷貝)調用。然而,如果要拷貝整個數(shù)組,無論在空間上還是在時間上,其開銷都是非常大的。更重要的是,在絕大部分情況下,你其實并不需要整個數(shù)組的拷貝,你只想告訴函數(shù)在那一刻對哪個特定的數(shù)組感興趣。這樣的話,為了節(jié)省時間和空間,提高程序運行的效率,于是就有了上述的規(guī)則。同樣的,函數(shù)的返回值也不能是一個數(shù)組,而只能是指針。
2、傳遞給函數(shù)參數(shù)不是指針本身
void fun(char *p)
{
       char c = p[3];//或者是char c = *(p+3);
}
intmain()
{
        char *p2 = “abcdefg”;
        fun(p2);
        return 0;
}
        這個函數(shù)調用,真的把p2 本身傳遞到了fun 函數(shù)內部嗎?我們知道p2 是main 函數(shù)內的一個局部變量,它只在main 函數(shù)內部有效。(這里需要澄清一個問題:main 函數(shù)內的變量不是全局變量,而是局部變量,只不過它的生命周期和全局變量一樣長而已。全局變量一定是定義在函數(shù)外部的。初學者往往弄錯這點。)既然它是局部變量,fun 函數(shù)肯定無法使用p2 的真身。那函數(shù)調用怎么辦?好辦:對實參做一份拷貝并傳遞給被調用的函數(shù)。即對p2 做一份拷貝,假設其拷貝名為_p2。那傳遞到函數(shù)內部的就是_p2 而并非p2 本身。
 
我們看下面的例子:
void GetMemory(char * p, int num)
{
       p = (char *)malloc(num*sizeof(char));
}
int main()
{
        char *str = NULL;
        GetMemory(str,10);
        strcpy(str,”hello”);
        free(str);//free 并沒有起作用,內存泄漏
       return 0;
}
       在運行strcpy(str,”hello”)語句的時候發(fā)生錯誤。這時候觀察str 的值,發(fā)現(xiàn)仍然為NULL。也就是說str 本身并沒有改變,我們malloc 的內存的地址并沒有賦給str,而是賦給了_str。而這個_str 是編譯器自動分配和回收的,我們根本就無法使用。所以想這樣獲取一塊內存是不行的。那怎么辦? 兩個辦法:
第一:用return。
char * GetMemory(char * p, int num)
{
      p = (char *)malloc(num*sizeof(char));
      return p;
}
int main()
{
        char *str = NULL;
        str = GetMemory(str,10);
        strcpy(str,”hello”);
        free(str);
        return 0;
}
這個方法簡單,容易理解。
第二:用二級指針。
void GetMemory(char ** p, int num)
{
        *p = (char *)malloc(num*sizeof(char));
}
int main()
{
       char *str = NULL;
       GetMemory(&str,10);
       strcpy(str,”hello”);
       free(str);
       return 0;
}
       注意,這里的參數(shù)是&str 而非str。這樣的話傳遞過去的是str 的地址,是一個值。在函數(shù)內部,用鑰匙(“*”)來開鎖:*(&str),其值就是str。所以malloc 分配的內存地址是真正賦值給了str 本身。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多