欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
函數指針參數傳遞
1、數組作為函數參數
void fun(char a[10])
{
      int i = sizeof(a);
      char c = a[3];
}
        如果數組b 真正傳遞到函數內部,那i 的值應該為10。但是我們測試后發(fā)現i 的值竟然為4!為什么會(huì )這樣呢?難道數組b 真的沒(méi)有傳遞到函數內部?是的,確實(shí)沒(méi)有傳遞過(guò)去,這是因為這樣一條規則:C 語(yǔ)言中,當一維數組作為函數參數的時(shí)候,編譯器總是把它解析成一個(gè)指向其首元素首地址的指針。
         這么做是有原因的。在C 語(yǔ)言中,所有非數組形式的數據實(shí)參均以傳值形式(對實(shí)參做一份拷貝并傳遞給被調用的函數,函數不能修改作為實(shí)參的實(shí)際變量的值,而只能修改傳遞給它的那份拷貝)調用。然而,如果要拷貝整個(gè)數組,無(wú)論在空間上還是在時(shí)間上,其開(kāi)銷(xiāo)都是非常大的。更重要的是,在絕大部分情況下,你其實(shí)并不需要整個(gè)數組的拷貝,你只想告訴函數在那一刻對哪個(gè)特定的數組感興趣。這樣的話(huà),為了節省時(shí)間和空間,提高程序運行的效率,于是就有了上述的規則。同樣的,函數的返回值也不能是一個(gè)數組,而只能是指針。
2、傳遞給函數參數不是指針本身
void fun(char *p)
{
       char c = p[3];//或者是char c = *(p+3);
}
intmain()
{
        char *p2 = “abcdefg”;
        fun(p2);
        return 0;
}
        這個(gè)函數調用,真的把p2 本身傳遞到了fun 函數內部嗎?我們知道p2 是main 函數內的一個(gè)局部變量,它只在main 函數內部有效。(這里需要澄清一個(gè)問(wèn)題:main 函數內的變量不是全局變量,而是局部變量,只不過(guò)它的生命周期和全局變量一樣長(cháng)而已。全局變量一定是定義在函數外部的。初學(xué)者往往弄錯這點(diǎn)。)既然它是局部變量,fun 函數肯定無(wú)法使用p2 的真身。那函數調用怎么辦?好辦:對實(shí)參做一份拷貝并傳遞給被調用的函數。即對p2 做一份拷貝,假設其拷貝名為_(kāi)p2。那傳遞到函數內部的就是_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 并沒(méi)有起作用,內存泄漏
       return 0;
}
       在運行strcpy(str,”hello”)語(yǔ)句的時(shí)候發(fā)生錯誤。這時(shí)候觀(guān)察str 的值,發(fā)現仍然為NULL。也就是說(shuō)str 本身并沒(méi)有改變,我們malloc 的內存的地址并沒(méi)有賦給str,而是賦給了_str。而這個(gè)_str 是編譯器自動(dòng)分配和回收的,我們根本就無(wú)法使用。所以想這樣獲取一塊內存是不行的。那怎么辦? 兩個(gè)辦法:
第一:用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;
}
這個(gè)方法簡(jiǎn)單,容易理解。
第二:用二級指針。
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;
}
       注意,這里的參數是&str 而非str。這樣的話(huà)傳遞過(guò)去的是str 的地址,是一個(gè)值。在函數內部,用鑰匙(“*”)來(lái)開(kāi)鎖:*(&str),其值就是str。所以malloc 分配的內存地址是真正賦值給了str 本身。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言的那些秘密之---函數返回局部變量
內存溢出總結:
指針的一些問(wèn)題
【c++】指針參數是如何傳遞內存的
指針參數是如何傳遞內存的
C語(yǔ)言中二級指針做參數 (轉)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久