C Primer Plus学习 五十七 string.h库中的 memcpy ( )和 memmove ()

        不能把一个数组的值直接陚予另一数组,因此,我们使用循环把数组中的元素逐个复制到另一数组。 一个例外情况是:可以使用strcpy ()和strncpy ()函数复制字符数组。memcpy ()和memmove ()函 数为复制其他类型的数组提供了类似的便利工具。下面是这两个函数的原型:
        void *memcpy (void * restrict si, const void * restrict s2, si2e_t n): void *menunove (void *sl» const void *s2* size_t n);
        这两个函数均从s2指向的位置复制n字节数据到si指向的位置,且均返回si的值。两者间的差别由 关键字restrict造成,即memcpy ()可以假定两个内存区域之间没有重叠。memmove ()函数则不作这个 假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy ()会怎样呢?其行为是不可预知的,即可能正常工作,也可能失败。在 不应该使用memcpy ()时,编译器不会禁止使用memcpy ()。因此,使用memcpy ()时,您必须确保没有重叠区域。这是程序员的任务的一部分。

        这两个函数可对任何数据类型进行操作,因此两个指针参数为void类型指针。C允许将任何类型的指 针賦值给void*类型指针。接受各种类型指针导致函数无法知道要复制的数据类型。因此,这两个函数使 用第三个参数来指定要复制的字节数。注意,对数组而言,字节数一般不等于元素的个数。因此,如果复制10个double值组成的数组,那么应使用10*sizeof (double)作为第三个参数,而不应使用10。

// mems.c —使用memcpy ()和memmove ()函数

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define SIZE 10

void show_array(const int ar[],int n);



int main(void)

{

int values[SIZE]={

1,2,3,4,5,6,7,8,9,10

};

int target[SIZE];

double curious[SIZE/2]={

1.0,2.0,3.0,4.0,5.0

};

puts("memcpy() sded:");

puts("values (original data):");

show_array(values,SIZE);

memcpy(target,values,SIZE*sizeof(int));

puts("target (copy of values):");

show_array(target,SIZE);

puts("\nusing memove()with overlapping ranges:");

memmove(values+2,values,5*sizeof(int));

puts("values-elements 0-5 copied to 2-7:");

show_array(values,SIZE);

puts("\nUsing memcpy() to copy double to in:");

memcpy(target,curious,(SIZE/2)*sizeof(double));

puts("target --5 doubles into 10 int positions:");

show_array(target,SIZE);

return 0;

}

void show_array(const int ar[],int n)

{

int i;

for(i=0;i<n;i++)

{

printf("%d ",ar[i]);

}

putchar('\n');

}

输出如下:

memcpy() used: 

values {original data):

1 2 3 4 5 6 7 8 9 10 

target (copy of values):

1 2 3 4 5 6 7 8 9 10

Using memmove()with overlapping ranges:

 values elements 0-5 copied to 2-7: 

1 2 1 2 3 4 5 8 9 10

Using memcpy() to copy double to int: 

target -- 5 doubles into 10 int positions:

0 1072693248 0 1073741824 0 1074266U2 0 1074790400 0 1075052544

       最后一次memcpy ()调用把数据从double数组复制到int数组。这表明memcpy ()不知道也不关心 数据类型;它只是把一些字节从一个位置复制到另一个位置(例如,可以从结构中复制字节到字符型数组)。 复制过程中也不进行数据转换。如果使用循环对元素逐个陚值,那么在陚值过程中会将double类型值转换 为int类型值。此时,对字节按原样进行复制,然后程序将把数据作为int类型进行解释。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值