• <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>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            數組和指針這東西有時還是比較麻煩:
            指針是很危險的,但同時也是非常強大的,就如一個高手拿AWP和一個菜鳥拿AWP一樣,一個是最恐怖的魔鬼,另一個卻是被虐的對象。
            const int *p 和 int const *p 指的是數組的內容不能改變。
            int * const p 指的是指針名不能改變。誰在 const 后面,誰就是不變的。
             
            二維數組動態(tài)分配:
            int **p;
            int row = 5;
            int column = 10;
            p = new int*[row];
            for (int i=0; i<row; i++) {
                    p[i] = new int[column];
            }
             
            指針即是地址(0xf0765fea),是無符號整數,占用四個字節(jié),32位。怎么判斷一個指針所指向的類型?
            去掉一個 * 和變量名后所留下的部分就是指針所指向的類型。
            如 int *p; 去掉一個 * 和變量名 p 后就只有 int 了,所以 p 指向 int 的整形數。
            float **p; 則 p 指向的類型是 float *,即 float 類型的指針,或 float 類型的地址,也即數組。
            那么在給 p 分配內存時,p = new float*[23],即指向一些
            在C或C++中有一個很好的地方是,即使你定義的變量是指針,但可與用訪問數組下標的方法來訪問指針所指向的數據;int **p;   *(*(p+i) + j) 等同于 p[i][j],使用數組下標來訪問更直觀。
             
            使用變量來聲明數組的長度,使程序更具有健壯性. int length = 10; int array[length].
            給定一個二維數組和一個位置數loc,怎么確定這個數對應數組中的那一個位置?
            array[loc / column][loc % column]
             
            當定義一個數組時,但沒有初始化,這時數組的內容是還是原來內存中的值。
             
            void * 的使用
            可以把任何類型的指針直接傳給 void* 的變量。
            但是反過來,卻不能直接把 void* 傳給其他類型指針,必須明確的進行強制類型轉換
            int *pi;
            void * pv = pi; // Ok
            float *pf = (float*)pv; // Ok
            double *pd = pv; // Error
             
            char *str = (char*)malloc(sizeof(char) * number);
            malloc分配一段內存,返回這段內存的首地址,其值為 void *,這樣,不管什么類型的指針都可以用這個函數來進行內存分配,void * 實現(xiàn)了相當于 C++ 中的函數模板的功能,實現(xiàn)了在C中的多態(tài)。各種類型說明符,就是為了說明每次進行存取的時候操作多少字節(jié)。
             
            數組名是這個數組的首地址,與他的第一個元素的地址是指向同一個地址,但數組卻是一個常量,只能進行右值計算,是不可改變的。指針變量也是指向地址,但指針變量是可以改變的,可以進行右值計算,也可以左值計算。
             
            字符數組的結束符號是'\0',其整型值是 0,即 NULL
            雖然這樣,但在OpenGL中,如在 glGenTextures 的調用中,經常用的是第一個元素的地址,而不是用數組名。
             
            用數組實現(xiàn)折半查找:
            在最壞的情況下,1024個元素只需要進行10查找,但查找前要先排序
            返回要查找的數在數組的下標,當不在數組中是,返回 -1,因為數組下標是從0開始的。
            int binarySearch(const int *p, const int g, int low, int height) {
                     int mid;
             
                     while (low <= height) {
                             mid = (low + height) / 2;
                             if (g < p[mid]) {
                                      height = mid - 1;
                             } else if (g > p[mid]) {
                                      low = mid + 1;
                             } else {
                                      return mid;
                             }
                      }
             
                      return -1;
            }
             
            快速排序:
            void quickSort(int *p, int low, int height) {
                      if (low >= height) {
                              return;
                      }
             
                      const int l = low;
                      const int h = height;
                      int ref = p[(low + height)/2];
                      int temp = 0;
             
                      // 如果沒有等于這個條件,那么如 3, 2, 1時,就會造成下一次排序為1,2 ; 2, 3,多出來一個 2
                      while (low <= height) {
                                // 找到大于等于 ref 的數,這里很重要,如果用 <= 的話,即找到比 ref 大的數,
                              // 可能會造成數組越界
                                while (p[low] < ref) { 
                                          low++;
                                }  
                                while (p[height] > ref) {
                                          height--;
                                }
              
                                // 這個條件是必須的,否則不能正確排序, l1,3,4,2,2,3,h5, 3為ref
                                // 第一次排序后,1, 3, l4, 2, h2, 3, 5
                                // 第二次排序后,1, 3, 2, lh2, 4, 3, 5,這時還可以進行下一次排序
                                // 第三次排序,h仍在2處,但l要找大于等于他的數,即1, 3, 2, h2, l4, 3, 5
                                // 如果沒有這個條件,那么就要進行交換,1, 3, h2, 4, 2, l3, 5,有錯誤發(fā)生
                                if (low <= height) {
                                          temp = p[low];
                                          p[low] = p[height];
                                          p[height] = temp;
                                          low++;
                                          height--;
                                }
              
                      }
             
                      quickSort(p, low, h);
                      quickSort(p, l, height);
                      // 第一次壓入(low, height)
                 // 從棧中取出一對(low, height)進行每個片段的排序
                      // 每排完一遍后,即上面的while執(zhí)行完一次,壓入(low,h)和(l,height)
                 // 利用棧消除遞歸
             
                      return;
            }
             
            排序一般當元素個數大于三十個時利用快速排序的速度比較快,當元素個數小于三十個時,利用選擇排序比較好,所以一般都是選擇排序和快速排序結合起來使用。
            posted on 2010-12-17 17:30 逛奔的蝸牛 閱讀(568) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            久久亚洲国产精品五月天婷| 国产日韩欧美久久| 国产免费久久精品99re丫y| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久精品国内一区二区三区| 久久免费精品一区二区| 久久久99精品一区二区| 伊人久久大香线蕉av不变影院 | 久久嫩草影院免费看夜色| 一级a性色生活片久久无少妇一级婬片免费放| 一本色道久久综合狠狠躁篇 | 久久精品国产免费观看| 94久久国产乱子伦精品免费| 国产精品中文久久久久久久| 久久最近最新中文字幕大全| 7777久久久国产精品消防器材| 欧美日韩中文字幕久久伊人| 亚洲AV无码久久精品成人| 欧美国产成人久久精品| a级毛片无码兔费真人久久| 亚洲成色WWW久久网站| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久天天躁狠狠躁夜夜2020| www性久久久com| 久久亚洲AV成人出白浆无码国产 | 久久精品国产99久久久| 久久久久久久91精品免费观看| 久久99精品久久久久久野外| 嫩草伊人久久精品少妇AV| 久久午夜免费视频| 色妞色综合久久夜夜| 久久男人AV资源网站| 久久一区二区三区99| 久久影院久久香蕉国产线看观看| 91精品国产高清久久久久久91| 国产精品99久久久久久人| 国产精品久久久久影院嫩草 | jizzjizz国产精品久久| 久久99精品久久久久久动态图 | 国产成人精品久久亚洲高清不卡| 国产成人久久精品激情|