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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值