海闊天空

          I'm on my way!
          隨筆 - 17, 文章 - 69, 評論 - 21, 引用 - 0
          數據加載中……

          void 類型的指針

          指針有兩個屬性:指向變量/對象的地址
          長度
          但是指針只存儲地址,長度則取決于指針的類型
          編譯器根據指針的類型從指針指向的地址向后尋址
          指針類型不同則尋址范圍也不同,比如:
          int*從指定地址向后尋找4字節作為變量的存儲單元
          double*從指定地址向后尋找8字節作為變量的存儲單元

          1.void指針是一種特別的指針
             void *vp
            //說它特別是因為它沒有類型
            //或者說這個類型不能判斷出指向對象的長度

          2.任何指針都可以賦值給void指針
            type *p;
            vp=p;
            //不需轉換
            //只獲得變量/對象地址而不獲得大小

          3.void指針賦值給其他類型的指針時都要進行轉換
             type *p=(type*)vp;
             //轉換類型也就是獲得指向變量/對象大小
          轉:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry

          4.void指針不能復引用
            *vp//錯誤
            因為void指針只知道,指向變量/對象的起始地址
            而不知道指向變量/對象的大小(占幾個字節)所以無法正確引用

          5.void指針不能參與指針運算,除非進行轉換
             (type*)vp++;
            //vp==vp+sizeof(type)



          #include<iostream>
          #include<stdlib.h>
          #include<string>
          using namespace std;
          typedef struct tag_st
          {
          char id[10];
          float fa[2];
          }ST;
          //我在程序里面這樣使用的
          int main()
          {
          ST * P=(ST *)malloc(sizeof(ST));
          strcpy(P->id,"hello!");
          P->fa[0]=1.1;
          P->fa[1]=2.1;

          ST * Q=(ST *)malloc(sizeof(ST));
          strcpy(Q->id,"world!");
          Q->fa[0]=3.1;
          Q->fa[1]=4.1;
          void ** plink=(void **)P;
          *((ST *)(plink)) = * Q; //plink要先強制轉換一下,目的是為了讓它先知道要覆蓋的大小.
                                   //P的內容竟然給Q的內容覆蓋掉了.
          cout<<P->id<<" "<<P->fa[0]<<" "<<P->fa[1]<<endl;
          return 0;
          }



          轉自:http://www.cppblog.com/dragon/archive/2008/09/02/60760.aspx

          posted on 2009-08-08 17:09 石頭@ 閱讀(1966) 評論(0)  編輯  收藏 所屬分類: 語言基礎


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泰兴市| 定日县| 仪征市| 金昌市| 柳州市| 中卫市| 建瓯市| 阆中市| 达日县| 杨浦区| 仙游县| 原阳县| 监利县| 防城港市| 安泽县| 肥乡县| 昌黎县| 阿拉善左旗| 临洮县| 阳东县| 望奎县| 华池县| 雅安市| 翁牛特旗| 同德县| 建宁县| 彭州市| 准格尔旗| 三穗县| 隆尧县| 山东省| 吐鲁番市| 昌都县| 黔东| 涿鹿县| 望江县| 牡丹江市| 蓝山县| 会宁县| 北辰区| 抚顺县|