好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了!
今天复习第一个知识点,为什么要叫复习呢?!
 
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. Kerberos原理和基础小结

    此篇文章仅做Kerberos的基本原理和基本使用做说明,本人对Kerberos了解有限,也是通过大量英文文档中翻译过来, 加上自己对Kerberos的理解所写,本人英文太菜,看文档看的头昏眼花若有写的 ...

  2. ACM数论-求组合数

    我们利用这个公式求阶乘和逆元求阶: #include<cstdio> const int N = 200000 + 5; const int MOD = (int)1e9 + 7; int ...

  3. 题解报告:hdu 1230 火星A+B(字符串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230 Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要 ...

  4. 用代码设置 RelativeLayout.LayoutParams

    1.注意 不能在RelativeLayout容器本身和他的子元素之间产生循环依赖,比如说,不能将RelativeLayout的高设置成为WRAP_CONTENT的时候将子元素的高设置成为 ALIGN_ ...

  5. 215 Kth Largest Element in an Array 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,它是数组有序排列后的第 k 个最大元素,而不是第 k 个不同元素.例如,给出 [3,2,1,5,6,4] 和 k = 2,返回 5.注意事项:你可以假 ...

  6. 启动Windows PowerShell ISE

    Windows Server 2008 R2 环境下,启动PoserShell ISE方法: 方法1:在cmd.exe控制台或运行框中,输入 powershell_ise.exe 执行即可. 方法2: ...

  7. Java实现求二叉树的路径和

    题: 解: 这道题考的是如何找出一个二叉树里所有的序列. 我的思路是先从根节点开始遍历,找出所有的子节点,因为每个子节点只有一个父节点,再根据每个子节点向上遍历找出所有的序列,再判断序列的总和. 这样 ...

  8. RabbitMQ七:交换机类型Exchange Types--Fanout 介绍

    前言 最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 其中之前我们用 ...

  9. SQL常用系统信息语句

    一.查询指定表外键约束 SELECT  A.name AS 约束名 ,        OBJECT_NAME(B.parent_object_id) AS 外键表 ,        D.name AS ...

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

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