關於C/C++ void指標,使用void指標拷貝int 陣列

gaopengtttt發表於2016-05-06


在C/C++中void代表的就是無型別或者為空,作為void *p這樣的定義則說明這個指標
只包含了指標位置而不包含指標的型別,一般的指標包含2個屬性指標位置和型別,
其中型別就能判斷出其長度。


借用網友的總結如下,我覺得總結得非常好。


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


2.任何指標都可以賦值給void指標 
   int *p;
   void *vp; 
   vp=p; 
   //不需轉換 
   //只獲得變數/物件地址而不獲得大小 


3.void指標賦值給其他型別的指標時都要進行轉換 
   type *p=(type *)vp; 
   //轉換型別也就是獲得指向變數/物件大小 


4.void指標不能取值
   *vp//錯誤 
   因為void指標只知道,指向變數/物件的起始地址 
   而不知道指向變數/物件的大小(佔幾個位元組)所以無法正確引用 


5.void指標不能參與指標運算,除非進行轉換 
   (type*)vp++; 
   //vp==vp+sizeof(type)
   
   
當然瞭解了void指標我們需要用void指標做點什麼:
我們知道對於字串指標如果COPY一個字串到另外一個字串
可以使用strcpy之類的函式,對於結構體而言可以直接相等,
但是對於其他型別的陣列的如int a[2];我們如何複製資料呢
當然一個元素一個元素的複製當然可以,但是是不是有點麻煩那麼我們如下
演示,並且結構體也是用這樣的方法。


gaopeng@bogon:~/CPLUSPLUS$ vi test3.c 


  1 /*************************************************************************
  2     > File Name: test3.c
  3     > Author: gaopeng
  4     > Mail: gaopp_200217@163.com 
  5     > Created Time: Thu 05 May 2016 11:39:57 AM CST
  6  ************************************************************************/
  7 //void *memcpy(void *dest, const void *src, size_t n);
  8 //
  9 #include<stdio.h>
 10 #include <string.h>
 11 #include<stdlib.h>
 12 
 13 struct mystr
 14 {
 15     int id;
 16     char name[10];
 17 };
 18 
 19 
 20 int main(void)
 21 {
 22     int a[2]={1,2};
 23     int b[2];
 24     int *c;
 25     struct mystr st1;
 26     struct mystr st2;
 27     struct mystr *st3;
 28 
 29 
 30     c = (int *)memcpy((void *)b,(void *)a,8 );
 31     printf("%d,%d,%d\n",a[1],b[1],c[1]);
 32    
 33     st1.id = 1;
 34     strcpy(st1.name,"test");
 35     
 36     //also can you st2=st1 to cpy struct but int array not way use memcpy function;
 37 
 38     st3 = (struct mystr *)memcpy((void *)(&st2),(void *)(&st1),sizeof(struct mystr)); 
 39 
 40     printf("%d,%s,%d,%s,%d,%s\n",st1.id,st1.name,st2.id,st2.name,st3->id,st3->name);
 41 
 42 }        
 
執行如下:
gaopeng@bogon:~/CPLUSPLUS$ ./a.out 
2,2,2
1,test,1,test,1,test


可以看到執行沒有問題,我們使用memcpy進行了記憶體的拷貝,並且memcpy返回一個指標我們強制轉換為
相應型別的指標就是這裡的st3和c,實際上這個指標只是指向了st2和b的位置因為memcpy返回的是一個
目的記憶體起始位置的一個指標
這裡重點在於:
c = (int *)memcpy((void *)b,(void *)a,8 );
st3 = (struct mystr *)memcpy((void *)(&st2),(void *)(&st1),sizeof(struct mystr)); 


可以看到void指標非常有用,需要了解其實質。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2094937/,如需轉載,請註明出處,否則將追究法律責任。

相關文章