好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了!
今天复习第一个知识点,为什么要叫复习呢?!
 
void *memset(void *buffer,int c,int count) 包含于头文件 #include <cstring>
buffer:为指针或是数组,c是赋予buffer的值,count是buffer的长度。
作用是在一段内存块中填充某个给定的值,它对较大的结构体或者数组进行清零操作的一种最快的的方法;
这个函数本质上是用来给字符赋初值的,所以它每次赋值是一个一个字节的赋值,也就是说int c中 c 的范围是:[-128,127]
 

  • memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为' '或'\0';
            单个字符串数组以及数组的话,比较直接 char a[100];memset(a,'\0',sizeof a);(注意哦这里真的可以不打括号)
            对于结构体的话,我觉得不实用,略;
  • memset要注意的是数组用来初始化别的整数,最好不要这个样子来搞,比较容易出事;
    例如:(这里注意一下,不要直接使用sizeof a)
#include <cstring>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f
int main(){
     char a[10] = { "1234567" };
     printf("%s\n", a);
     memset(a, 'd', 5*sizeof(char));
     printf("%s\n", a);
     return 0;
}
运行输出
1234567
ddddd67
请按任意键继续. . .
 
假如类型变成int呢?(这里就可以使用我舒服的sizeof a了);
#include <cstring>
#include <iostream>
using namespace std;
int main(){
     int a[5] = { 100 };
     for (int i = 0; i < 5; i++){
           cout << a[i] << " ";
     }cout << endl;
     memset(a, 1, sizeof a);
     for (int i = 0; i < 5; i++){
           cout << a[i] << " ";
     }cout << endl;
     return 0;
}
运行输出如下
100 0 0 0 0
               16843009 16843009 16843009 16843009 16843009
请按任意键继续. . .
 
至于为什么不是1呢??因为memset赋值是按一个字节来进行赋值,而整形是四个字节!!
所以用来赋值最大的时候,结合0x3f3f3f3f; 简直爽的不要不要;
 
上面写的简直是一坨屎,当时都忘了一个字节多大;今天延续昨天晚上由一个常数加LL引发的命案;现在说到了常数赋值操作。
 
  • 对于常用0和-1赋初始值的直接运用
 
先来讲这个函数为什么能直接的对0和-1进行赋初始值操作,前面说到memset是按一个字节来进行赋值的,所以0我们很好理解
int 是32位,其二进制是 0000 0000 0000 0000 0000 0000 0000 0000 (四个字节),其中取尾端的一个字节来对int的四个字节来进行赋值;
很明显的看到起结果还是 0000 0000 0000 0000 0000 0000 0000 0000;那我们再来看-1;这里就有点问题了,-1(int)的二进制是 1000
0000 0000 0000 0000 0000 0000 0001;按照刚刚讲的来的话岂不是赋值完之后就应该成 0000 0001 0000 0001 0000 0001 0000 0001?
这样子就不是-1了啊!别着急,这里就要讲到很重要的一点,由于计算机底层当中,数据存放的方式是补码,所以我们这里还需要将它转化为二进制补码:1111 1111 1111 1111 1111 1111 1111 1111 ;那在按刚刚的来是不是就没有错了啊。
 
回忆刚刚我们讲到了一个细节,为什么是从尾部的一个字节拿过来进行赋值呢?这一点我们实践一下就知道了 ,整个这样的数不就行了吗
0000 1000 0000 0100 0000 0010 0000 0001;是不是很妙啊哈哈哈哈,用计算器得到这个数为262657,运行一下
是不是就得到了验证;
 
  • 对于赋最大值的思考
 
int 是32位的,所有它的最大值的话就应该是 0111 1111 1111 1111 1111 1111 1111 1111,这个结果十进制2 147 483 647,十六进制0x7FFFFFFF;看这个数的尾部是不是和-1有点像?没错,要是用这个赋初值,那你就死定了,就赋成-1了!之前一直不能理解为什么好多人喜欢去用#define INF 0x3f3f3f3f 然后memset(a,INF,sizeof a);这样子的话,这个值也不如0x7f7f7f7f这个这么大啊;
 
假如说单独的赋值,我们当然说用0x7fffffff作为最大值最好,但是用到了memset()函数,我们会认为0x7f7f7f7f比较好,但是我们还需要考虑一下另外的问题,无穷大也是有性质的,无穷加无穷还是等于无穷,如果我们用0x7ffffffff和0x7f7f7f7f的话,一加就溢出了!所有对于ACM做题的话,还是比较推荐使用0x3f3f3f3f来作为最大值。最小值类似就不讲了
 
还有注意到一个问题memset()似乎有点懒惰性,long long 这个类型的赋值,只会给前七个字节赋值,第八个字节是亏待过你吗?
 
 
 
平时总是会碰到溢出的情况,在这里贴一下int 的范围:[-2147483648,2147483647] em..1e10就不怕
long long de fanwei : [-9223372036854775808,9223372036854775807] em.. 1e19就不怕。

2018/08/23 cstring中memset()函数的运用的更多相关文章

  1. CString中Format函数与格式输入与输出

    CString中Format函数与格式输入与输出 Format是一个非经常常使用.却又似乎非常烦的方法,下面是它的完整概貌.以供大家查询之用:   格式化字符串forma("%d" ...

  2. cpp中memset函数的注意点

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  3. C/C++中memset函数

    本文学习参考http://baike.baidu.com/link?url=ZmSyY8ciB_nJt9KM-W2fiEFJrC2mugFsLqRdY2b4pLe8rD_jRXyN7_pj0GBBD2 ...

  4. 透彻分析C/C++中memset函数

    在C语言中,经常需要对内存进行操作,里面涉及很多函数,但是memset函数的使用有一点需要大家格外注意,这也是我在做项目时遇到过的一个问题,调试了很久才找出来错误. 函数原型是:void *memse ...

  5. C++中memset函数的用法

    转载:https://blog.csdn.net/qq_22122811/article/details/52738029 //复习数组的时候,第一次见到了memset,学之. memset:char ...

  6. Python学习-23.Python中的函数——isinstance

    在Python中可以使用isinstance函数来判断某个值或变量是否为某个类型. 例子: print(isinstance(1,int)) print(isinstance(1,float)) pr ...

  7. 2018.7.23 oracle中的CLOB数据类型

    Oarcle中的LOB类型 1.在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这 ...

  8. C++之memset函数

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  9. <cstring>中常用的两个函数memset()和memcpy()

    <cstring>是c++对c中的<string.h>进行了重写,这两个头文件中的函数用法是一样的,所以在用的时候包含哪个头文件都行.下面介绍一下 <cstring> ...

随机推荐

  1. [2010国家集训队]Crash的旅游计划

    Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Crash和陶陶所要去的城市里有N (N > 1) 个景点,Cra ...

  2. poj 3164 Command Network (朱刘算法)

    题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...

  3. css超出部分显示省略号

    单行文本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. Docker安装jenkins(六)

    这里是在linux环境下安装docker之后,在doucer内安装jenkins --------------------docker 安装 jenkins---------------------- ...

  5. Linux之测试服务器和端口连通

    目录 wget工具 telnet工具 ssh工具 wget工具: 该工具是网络自动下载工具,如果linux或centos中不存在,需要先安装,支持http.https.ftp协议,wget名称的由来是 ...

  6. 全志R58平台调通s5k5eya(RAW+MIPI)

    全志R58平台调通s5k5eya(RAW+MIPI) 2017/5/31 10:30 版本:V1.1 1.前期使用的是s5k5eyx的ISP的固件/tuning 文件 Y:\s5k5eya_r58_d ...

  7. opencv4android移植到系统app

    最近在尝试使用opencv4android实现投影仪的自动对焦功能,在AndroidStudio后需要将功能移到系统工程编译成系统app,仅以此文记录下移植过程中遇到的问题. 首先去opencv官网下 ...

  8. java 解析四则混合运算表达式并计算结果

    package ch8; import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * 四则混合运 ...

  9. 解决重置PostgreSQL 9.6密码的问题

    一.PostgreSql9.6重置密码的方法: 1.打开windows服务管理器,找到“postgresql-x64-9.6”服务,停止服务. 2.找到PostgreSQL9.6的安装目录(以我的E盘 ...

  10. Node.js——异步上传文件

    前台代码 submit() { var file = this.$refs.fileUpload.files[0]; var formData = new FormData(); formData.a ...