關於C/C++ void指標,使用void指標拷貝int 陣列
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- int存放到void指標指標
- 通過qsort(void * lineptr[], int left, int rifht, int (*comp)(void *, void *))解讀指標函式和void指標...指標函式
- 簡述static關鍵字、void與void *(void指標)、函式指標指標函式
- 注意C++中物件指標,慎用void*C++物件指標
- typedef void (*Fun) (void) 的理解——函式指標——typedef函式指標函式指標
- C++ 指標陣列與陣列指標的區別C++指標陣列
- 徹底搞清C/C++中一維陣列,二維陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係C++陣列指標
- 陣列指標,指標陣列陣列指標
- 陣列指標 指標陣列陣列指標
- 指標陣列與陣列指標指標陣列
- 陣列指標和指標陣列陣列指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- C++語言中陣列指標和指標陣列徹底分析(系列一) (轉)C++陣列指標
- C語言知識彙總 | 56-C語言NULL空指標以及void指標C語言Null指標
- C陣列和指標陣列指標
- Go 陣列指標(指向陣列的指標)Go陣列指標
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 關於C/C++ int (*t5)[3] 指標型別說明C++指標型別
- 補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)C++陣列指標
- 指標陣列和陣列指標與二維陣列指標陣列
- 陣列指標陣列指標
- C語言程式設計基礎:指標陣列與陣列指標C語言程式設計指標陣列
- C語言學習歷程(十二)陣列指標與指標陣列C語言陣列指標
- 陣列指標:a pointer to an array,即指向陣列的指標陣列指標
- C++ this 指標C++指標
- C++ 指標C++指標
- 深入探索 C/C++ 陣列與指標的奧祕之一:陣列與指標概念剖析C++陣列指標
- C/C++指向指標的指標C++指標
- C語言 指標與陣列C語言指標陣列
- C指標和陣列的關係詳解指標陣列
- 陣列和指標陣列指標
- 指標和陣列指標陣列
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- C/C++——指向函式的指標和指向函式的指標的陣列C++函式指標陣列
- C++指標理解C++指標
- 【c++】智慧指標C++指標
- C++智慧指標C++指標
- 關於指標傳遞和指標的指標指標