• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-145  評論-173  文章-70  trackbacks-0
            近來在寫程序的時候遇到了一個問題,就是傳遞一個數組指針進入一個函數的時候,雖然指針能夠順利的傳遞,但是,我們無法求出該數組的大小。見下面的代碼:
            #include <stdio.h>
            void setNum(int *p,int a);
            void setNum(int *p);

            int main()
            {
                
            int a[] = {1,2,4,5};
                printf(
            "%d\n",sizeof(a)/sizeof(a[0]));
                setNum(a);
            }


            void setNum(int *p,int a)
            {
                
            *= a;
            }


            void setNum(int *p)
            {

                
            int Num = sizeof(p)/sizeof(p[0]);
                printf(
            "%d\n",Num);
            }
            結果是,輸出分別是4和1.

            原因分析:
            1.對于第一個輸出,由于在main函數中定義的為數組,所以可以直接利用sizeof函數來求出a數組的長度。
            2.對于傳遞參數類型,比如上面的setNum函數(未傳遞個數版本),此時,調用該函數的時候,a退化為一個普通的指針,也就是說,此時sizeof(p)求出來的就是一個指針的大小,除以int的大小,恰好為1.

            啟示:
            C語言中,不能夠根據一個數組指針就求出來任意一個數組的大小。解決辦法就是傳第一個參數進來,指定大小。

            ps:參考資料(詳實):http://topic.csdn.net/t/20060205/18/4540750.html

            摘錄:
            >   如果作為函數的參數是沒法求的, 
            >   但這樣是可以的: 
            >   
            >   #define   LENGTH(s)   (sizeof(s)   /   sizeof(int)) 
            >   
            >   int   s[12]; 
            >   int   length   =   LENGTH(s); 
            ================================================== 
            這樣的方法只能用于數組變量的數組名,對于指向數組的指針,以及作為參數的數組名都是沒有效果的,上面已經有人解釋了 
            》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
            不可能有辦法的。 
            當你定義一個數組的時候: 
            int   a[]   =   {1,   2,   3};     //   實際上被編譯為   int   a[3]   =   {1,2,3} 

            數組名代表的是數組的地址。注意   ——   你絕對沒有辦法通過數組名動態獲得數組的大小。當你丟失a的長度信息的時候,你永遠不可能知道他的長度。 

            那么   sizeof   是怎么回事呢?他不是通過   a   的名字獲得   a的大小了么?   ——   大錯特錯! 

            關鍵字   sizeof   產生的是一個編譯期常量(注1)   他的運作方式是這樣的: 

            當你寫: 
            sizeof   a   
            實質是: 
            sizeof   (   a的類型   ) 

            而a的類型是什么呢?編譯器察看   a的定義發現,   是   int   [3] 
            就是說,這里   sizeof   a   實質是: 
            sizeof   (   int[3]   ) 
            完全等同于常量   12   (假定int為4字節)。 


            考慮一個函數 
            void   func(   int   a[]   );     
            //   寫成   int   a[3]   也不會有本質區別——也許你該試試寫成   int   (&a)   [3]   ? 

            C++規定,數組作為形參的時候,a代表數組首地址。 
            他的底層意義是:   a   退化為了一個4字節的指針,沒有任何變量表示數組的大小會“自動”被傳遞進來。 

            我們看看這個時候   sizeof   a是什么: 
            sizeof(   函數形參的a[]   )     =   sizeof(   int*   const   )   =   4     //   當然a[]不是合法的C++類型 


            仍然不服氣?好——我們反問一個問題:若你是C   /C++的設計者,   你怎么在兼容原有設計的基礎上讓void   func(   int   a[]   )同時傳遞地址和大小? 

            首先,a是一個變量,而且類似數組。他必須是一個地址,否則你不知道如何索引元素。 
            他怎么再帶上一個變量表示他的大小呢? 

            擴充   sizeof   (a)   的能力? 

            sizeof   a   必須產生代碼——不管是常量還是什么。   要讓他在運行時決定   a的值,   a就必須帶上他的大小信息。   

            1   你必須修改C標準,讓C支持“兩種”數組。一種是定義處的數組,他分配大片連續內存,和原來的C標準相同。 

            2   另一種是作為參數傳遞數組。   你必須傳遞地址和數組大小;這個數組實際上是一個8字節的結構{   地址;   大小}(事實上可能更加復雜,考慮多緯數組如何實現?   )   

            3   系統必須根據兩種不同數組分別實現其   []、*   、&等。   原有的數組根據其首地址偏移(這是個常量)和下標尋址;   而參數數組則首先取“地址”內容(這是個變量),然后根據這個地址尋址.... 

            厄...   再考慮多維數組——聽起來這不是一整套vector模型么? 

            ----------------------------------------------- 
            注1:   對于C99支持的   flexible   array   ,其   sizeof   運算是運行時求值


            posted on 2011-03-01 17:14 deercoder 閱讀(11729) 評論(0)  編輯 收藏 引用 所屬分類: C++
            久久亚洲精精品中文字幕| 久久久久免费视频| www性久久久com| 麻豆成人久久精品二区三区免费 | 中文字幕一区二区三区久久网站| 国产精品久久久久久久久| 国产一区二区精品久久凹凸| 伊人色综合久久天天网| 久久香综合精品久久伊人| 九九热久久免费视频| 日韩人妻无码精品久久久不卡 | 久久精品国产亚洲av影院| 国产精品永久久久久久久久久| 国产亚洲精久久久久久无码77777| 久久国产高潮流白浆免费观看| 精品国产日韩久久亚洲| 欧美一区二区精品久久| 一本久久a久久精品vr综合| 久久久久婷婷| 中文字幕亚洲综合久久| 996久久国产精品线观看| 久久夜色精品国产亚洲| 性高朝久久久久久久久久| 国产午夜精品理论片久久| 国内精品久久久久影院日本| 欧美亚洲国产精品久久| 久久有码中文字幕| 久久天天躁狠狠躁夜夜2020 | 国产精品久久波多野结衣| 久久久久亚洲AV成人网人人网站 | 99久久伊人精品综合观看| 99久久婷婷国产综合亚洲| 久久天天躁狠狠躁夜夜网站| 亚洲女久久久噜噜噜熟女| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久国产精品成人影院| 一本一本久久A久久综合精品| 色天使久久综合网天天| 久久久国产打桩机| 久久久亚洲欧洲日产国码是AV| 久久无码专区国产精品发布|