C语言学习笔记--内存操作

C语言内存操作:
函数原型:
    1、void *memcpy (void *dst,      void const *src, size_t length);
    2、void *memmove(void *dst,      void const *src, size_t length);
    3、void *memcmp (void const *a,  void const *b,   size_t length);
    4、void *memchr (void const *a,  int ch,          size_t length);
    5、void *memset (void *a,        int ch,          size_t length);
1、memcpy:
    memcpy从src的起始位置复制length个字节到dst的内存起始位置,你可以用这种方法复制任何类型的值,第三个参数指定复制值的长度(以字节计算)。 如果src和dst以任何形式出现了重叠,它的结果是未定义的。
    例如:
    char temp[SIZE],value[SIZE];
    memcpy(temp, value, SIZE);
    它从数组value复制SIZE个字节到数组temp。
    但是,如果两个数组都是整型数组怎么办呢?下面的语句可以完成这项任务:
    memcpy(temp, value, sizeof(value));
    前面两个参数不需要使用强制类型转换,因为在函数的原型中,参数的类型是void *型指针,而任何类型的指针都可以转换为void *类型指针。
    如果数组只有部分内容需要被复制,那么需要复制的数量必须在第三个参数中指明。对于长度大于一个字节的数据,要确保把数量和数据类型的长度相乘,例如:
    memcpy(saved_answers, answers, conut * sizeof(answers[0]));
    你也可以使用这种技巧复制结构或结构数组。
    返回值:该函数返回一个指向目标存储区dst的指针。
2、memmove:
    memmove函数的行为和memcpy差不多,只是它的源和目标操作数可以重叠。虽然它并不需要以下面这种方式实现,不过memmove的结果和这种方法的结果相同:把源操作数复制到一个临时位置,这个临时位置不会与源和目标操作数重叠,然后把它从这个临时位置复制到目标操作数。
    memmove通常无法使用某些机器所提供的特殊的字节-字符串处理指令来实现,所以它可能比memcpy慢一些。但是,如果源和目标真的可能存在重叠,就应该使用memmove。如下所示:
    memmove(x, x+1, (count-1) * sizeof(x[0]));
    返回值:该函数返回一个指向目标存储区dst的指针。
3、memcmp:
    memcmp对两端内存的内容进行比较,这两段内存分别起始于a和b,共比较length个字节。这些值按照无符号字符逐个字节进行比较函数的返回类型:负值表示a小于b,正值表示a大于b,零表示a等于b。
    由于这些值是根据一串无符号字节进行比较的,所以如果memcmp函数用于比较的不是单字节数据如整数或浮点数就可能给出不可预料的结果
4、memchr:
    从a的起始位置开始查找字符ch第一次出现的位置,并返回一个指向该位置的指针,它一共查找length个字节。如果在这length个字节中都没有找到该字符,函数就返回一个NULL指针。
5、memset:
    memset函数把从a开始的length个字节都设置为字符ch,例如:
    memset(buffer, 0, SIZE);
    把buffer的前SIZE个字节都初始化为0。
    
    

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/85269728
今日推荐