1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C语言中void cpy 关于C/C++ void指针 使用void指针拷贝int 数组

C语言中void cpy 关于C/C++ void指针 使用void指针拷贝int 数组

时间:2022-10-05 09:12:38

相关推荐

C语言中void cpy 关于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@

5 > Created Time: Thu 05 May 11:39:57 AM CST

6 ************************************************************************/

7 //void *memcpy(void *dest, const void *src, size_t n);

8 //

9 #include

10 #include

11 #include

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博客 ” ,链接:/7728585/viewspace-2094937/,如需转载,请注明出处,否则将追究法律责任。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。