内存块数据的操作

学习了数组,我们知道获取一段内存块。例如,我们定义一个字符数组,得到一段连续的内存块,用来存放一个字符串。例如:

内存块数据的操作_第1张图片

程序编译运行结果如下:

内存块数据的操作_第2张图片

可以看到,我们定义了buf[]字符数组,就是申请了一段内存空间,存放一串字符串。那么,我们能否进行字符串拷贝、字符串拼接这样的操作?

答案是可以的,C语言提供了strcpy()、strcat()、strcmp等函数,用于操作字符串。而且,提供了memcpy()、memset()、memcmp()等函数,用于操作内存块,下面我们学习这些函数的使用。这些函数需要包含头文件:

#include

这些函数的定义如下:

//字符串拷贝函数

//把src指向的字符串,拷贝到dest指向的内存空间;

//注意:dest指向的内存空间,必须要足够大,可以存放完 src 指向的字符串;

//该函数是字符串拷贝函数,要求src参数必须是一个有效的字符串,必须有字符串结束符;

char *strcpy(char* dest, const char *src);

 

//字符串连接函数

//把src指向的字符串,拷贝到dest字符串的末尾;

//注意:dest指向的内存空间,必须足够强大;可以添加存放src字符串到dest字符串的末尾;

char *strcat(char *dest, const char *src);

//字符串比较函数

//首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符,若差值不为0 则将差值返回;

//如果s1,s2对应的字符一直相等,就判断到s1和s2中某个字符串结束为止;

//返回值如果是0值,说明s1和s2字符串相等;

//返回值如果大于0,说明s1字符串比较大;

//返回值如果小于0,说明s2字符串比较大;

int strcmp(const char *s1,const char *s2);

 

//内存块拷贝函数

//把src指向内存块的 n 个字节,拷贝到 dest 指向的内存块;

//注意:strcpy()函数只能够拷贝字符串,memcpy函数可以拷贝内存块;

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

 

//内存块设置函数

//使用参数 c 填充到 s 指向内存块的 n 个字节空间;

//注意: 参数 c 是 int 类型,但是,只使用参数 c 的低字节填充 s 指向的内存块;

//例如 int c = 0x55667788; 就使用低字节 0x88 来填充数据;

void *memset(void *s, int c, size_t n);

 

//内存块比较函数;

//首先将s1第一个字节值减去s2第一个字节值,若差值为0则再继续比较下个字节,若差值不为0 则将差值返回;

//如果s1和s2的字节一直相等,一直判断到第n个字节;

//返回值如果是0值,说明s1,s2内存块的前n个字节相同;

//返回值如果大于0,说明s1内存块的ASCII值大;

 

//返回值如果小于0,说明s2内存块的ASCII值大;

int memcmp(const void *s1, const void *s2, size_t n);

下面我们举例分析这些函数的使用,代码如下:

内存块数据的操作_第3张图片

 

程序编译运行结果如下:

内存块数据的操作_第4张图片

 

在这个程序中,我们测试了strcpy()、strcat()、memcpy()等函数的使用。例如:

  1. 我们使用strcpy()函数拷贝字符串,如下:

strcpy(buf1, pstr1);//把pstr1字符串拷贝到buf1缓存;

此时,把pstr1字符串拷贝到buf1[]缓存中;

  1. 使用strcat()函数进行字符串拼接,如下:

strcat(buf1, pstr2);//把pstr2字符串拷贝到buf1缓存的末尾;

此时,把pstr2字符串拼接到buf1[]缓存中存放字符串的末尾;所以,输出:

buf1 = 韦凯峰 Linux C/C++ 编程,Linux系统编程,Openwrt系统开发!微信:13926572996

  1. 调用memset()函数对内存块设置数值,如下:

    //给buf1[]缓存的128个字节设置0值;相当于清空缓存的数据;

    memset(buf1, 0, 128);

此时,给buf1[]缓存中的前128个字节设置0值。

  1. 调用memcpy()函数内存块进行拷贝,例如:

memcpy(buf1, pstr1, strlen(pstr1));

此时,把pstr1指向内存的字符串长度,拷贝到buf1[]缓存数组中。

  1. 调用strcmp()函数进行字符串比较;输出的数据有0,1和-1这样的数值。表示字符串是否相等。
  2. 调用memcmp()函数进行内存块比较;输出的数据有0,1和-1这样的数值。表示内存块是否相等。

这些字符串和内存块的操作函数,非常有用,读者需要多加练习掌握。必须要自己手动敲打代码,多加练习测试,自己总结出这些API函数使用的方式。有任何疑问,可以联系作者,探讨、解决遇到的问题。

总结

本章节我学习了C语言指针更复杂的知识点,该知识点有些难度,建议读者多看几遍,多加思考。也可以联系作者,一起讨论学习!

作者建议:在学习的过程中,一定要多敲代码,多加思考。有任何疑问的地方,可以通过调试代码来分析问题和解决问题。

我们不要追求速度,不要走马观花式地学习。要稳扎稳打,掌握好每一个知识点!

读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。

你可能感兴趣的:(Linux,系统编程课程,Linux,C,程序设计课程,Linux,C++程序设计课程)