乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多