
C++
9号信箱
这个作者很懒,什么都没留下…
展开
-
【C语言学习疑难杂症】第12期:如何从汇编角度深入理解y = (*--p)++这行代码(易懂版)
这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。前6行就不讨论了,简单的说就是它把指针往前移动一个位置,然后解引用把里面的值赋值给y。但是后面的部分,也就是从第7行开始,我们需要重点理解。对于如下代码,思考一下输出结果是什么?原创 2023-12-26 22:35:39 · 1423 阅读 · 2 评论 -
【C语言学习疑难杂症】第11期:字符串字面值常量赋值给指针变量或者数组,90%的人都会出错的一道题目
虽然C++兼容了C语言,但是在语法层面上, 还是有很多需要注意的点,所以在使用对应的语言的时候,也要特别小心。提问:对于上述4行代码,在c语言和c++环境中,分别都有哪些是正确的?对于这个题目,一定要先思考下,看看自己是不是真的理解了!原创 2023-12-26 22:15:27 · 601 阅读 · 0 评论 -
【C语言学习疑难杂症】error C4996: ‘scanf‘: This function or variable may be unsafe
最近有很多同学表示,在使用scanf这个函数的时候出现了下面这样的错误,对于初学的同学来讲,不知道如何解决。不知道大家有没有同样的情况。原创 2023-07-25 08:00:00 · 2253 阅读 · 1 评论 -
一个字等于多少字节?
一个字等于多少个字节,与系统硬件(总线、cpu命令字位数等)有关。总线一般被设计来传输固定大小的一块数据,这块数据被称为字(word),一个字包含的字节数(即字的大小)是各种计算机系统里面的基本参数,而且这个参数在不同的系统里通常是不同的。大多数的现代计算机系统里面,一个字要么是4个字节,要么是8个字节.①:1字节(byte) = 8位(bit)②:在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit) 在32位的系统中(比如win32) ...原创 2021-08-27 17:05:58 · 41900 阅读 · 0 评论 -
【C语言学习疑难杂症】Stack arround the variable was corrupted问题
提出问题:在开启正文之前,我们先看这样一个例子。我们重点看这个弹出的Debug Errir框,中间划红线的部分,它报了这样一个错误。首先,我们特别强调一个问题就是,这个问题可能会在很多同学以后的学习中经常遇到,所以请务必重视这个问题。解决办法:对于这个问题,我们还是先回到这个案例中来,我们先来看看这位同学的代码出现了什么问题。首先,大家重点关注,代码中划红线的部分:定义了一个整型数组,含有5个元素。接下来,这位同学干了一件事,首先给j赋值5,这样就有一个b[5],这时候我们再回过原创 2021-08-21 17:50:27 · 2776 阅读 · 0 评论 -
malloc()和free()的原理及实现
在C语言中只能通过malloc()和其派生的函数进行动态的申请内存,而实现的根本是通过系统调用实现的(在linux下是通过sbrk()系统调用实现)。malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。malloc()在运行期动态分配分配内存,free转载 2020-11-25 15:55:14 · 638 阅读 · 0 评论 -
关于位段,你应当了解这些
位段与结构体的不同位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。 位段的成员名后边有一个冒号和一个数字。位段的跨平台问题int 位段被当成有符号数还是无符号数是不确定的。 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成...原创 2020-11-24 19:56:17 · 207 阅读 · 0 评论 -
为什么要进行内存对齐?本文也许可以帮到你
为什么存在内存对齐?大部分的参考资料都是如是说的:1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常。2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问。总体来说: 结构体的内存对齐是拿空间来换取时间的做法。但是关于上面的说法,其实是很难理解的,但是相信上面也是大家搜到的最多的答原创 2020-11-24 19:40:06 · 665 阅读 · 1 评论 -
我们为什么要定义不同的数据类型?数据类型的意义是什么?
要解决标题中的问题,我想可以从下面两个方面来回答: 数据类型解决了“存”的问题:它决定了使用这个类型需要开辟空间的大小以及内存中的数据是如何存储的; 数据类型解决了“取(读)”的问题:它改变了看待内存空间的视角,比如在内存中同样的两块4个字节的空间,存放着同样的二进制码,如果这两块内存对应的两个变量类型不一样,那么它们的意义也就不一样了。 ...原创 2020-10-21 18:22:43 · 8034 阅读 · 0 评论 -
C/C++中的标准泛空格符有哪些?
standard white-space characters are:' ' (0x20) space (SPC) '\t' (0x09) horizontal tab (TAB) '\n' (0x0a) newline (LF) '\v' (0x0b) vertical tab (VT) '\f' (0x0c) feed (FF) '\r' (0x0d) carriage return (CR) ...原创 2020-08-17 21:26:07 · 1195 阅读 · 0 评论 -
C语言要点系统复习一:数据类型
注意基本数据类型为6个。再加上两个符号说明符signed和unsigned就基本表示了C语言的最常用的数据类型。下面列出了在32位操作系统下 常见编译器下的数据类型大小及表示的数据范围:...原创 2020-07-22 23:05:10 · 136 阅读 · 0 评论 -
C++要点系统复习二:输入输出那些事
C++本身并没有直接定义io语句,它调用的是标准库函数。流指的是从某种io设备上读入或者写出的字符序列。流的定义也表示了字符随着时间会生成和消耗这种特征。4种io对象:cin(istream对象),cout(ostream对象),cerr,clog对于输出标识符<<来说,它的左边必须是ostream对象,右边是输出的值,返回的是左侧输出流对象。所以可以连续使用多个输出标识符在同一个语句中。注释不会增加程序大小,编译器会忽略在一个无限循环中使用标准输入流操作读取的时候,当遇到文原创 2020-07-22 16:38:22 · 145 阅读 · 0 评论 -
C++要点系统复习一:关于namespace命名空间的那些事
一、关于命名空间所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。1:<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了原创 2020-07-22 16:24:03 · 289 阅读 · 0 评论 -
推荐一篇关于程序执行过程的博文
原文出处:https://www.cnblogs.com/kelamoyujuzhen/p/9396447.html原创 2020-07-21 10:23:14 · 148 阅读 · 0 评论 -
在MFC主框架窗口中分割窗口
1.重载这个函数 OnCreateClient(ctrl+w打开类向导,添加CreatClient消息)2.CMyView 继承一个civew类 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){ // TODO: 在此添加专用代码和/或调用基类 m_splitt...原创 2018-04-08 12:00:34 · 878 阅读 · 0 评论 -
什么时候使用指针?什么时候使用引用?什么时候应该按值传递?
何时使用引用参数使用引用参数的主要原因有两个: (1)程序员能够修改调用函数中的数据对象。 (2)通过传递引用而不是整个数据对象,可以提高程序的运行速度。什么时候使用指针?什么时候使用引用?什么时候应该按值传递?下面是一些指导原则:对于那些函数,它们只使用传递过来的值,而不对值进行修改。(1)如果数据对象很小,如内置数据类型或小型结构,使用按值传递。 (2...转载 2018-05-20 15:09:58 · 2450 阅读 · 0 评论 -
以c语言中短整型(signed int)的取值范围为例说明各种数据类型取值范围的计算方式与原理
在开始我们的正文之前,你需要先了解一下原码、反码、补码这三个概念以及这三者之间的相互转换方式。 在有了一定的了解之后,我们开始我们的介绍。在本文中,我们以短整型为例,给大家介绍该类型的取值范围的计算方式,以及原理。 首先默认情况下,unsigned int 占用2个字节(跟具体的编译器和操作系统有关),也就是16位。 在计算机存储的数据中,都是用0和1表示的,并且是用补码表示的(很重要)。...原创 2018-05-07 20:28:45 · 11608 阅读 · 0 评论 -
C++格式化输出方式汇总
目录:控制符的方式用流对象的成员函数控制输出格式几点说明控制符的方式 控制符 作用 dec 设置数值的基数为10 hex 设置数值的基数为16 oct 设置数值的基数为8 setfill(c) 设置填充字符c,c可以是字符常量或字符变量 setprecision(n) 设置浮点数的精度为n位。...原创 2018-05-15 14:59:23 · 3800 阅读 · 1 评论 -
c++智能指针
引入Ooops. 尽管有另外一篇文章说C++11里的智能指针了。近来,我听到许多人谈论C++新标准,就是所谓的C++0x/C++11。 我研究了一下C++11的一些语言特性,发现确实它确实做出了一些惊奇的改变。我将重点关注C++11的智能指针部分。背景普通指针(normal/raw/naked pointers)的问题?让我们一个接一个的讨论。如果不恰当处理指针就会带来许多问题...转载 2018-08-16 17:37:15 · 168 阅读 · 0 评论 -
c++ volatile详解
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that an ...转载 2018-08-19 17:10:06 · 477 阅读 · 0 评论 -
c++深浅拷贝
浅拷贝:也就是在对象复制时,只是对对象中的数据成员进行简单的赋值,如果对象中存在动态成员,即指针,浅拷贝就会出现问题。 深拷贝:对于深拷贝,针对成员变量存在指针的情况,不仅仅是简单的指针赋值,而是重新分配内存空间。 在定义一个类的时候由于没有自定义拷贝构造函数,C++编译器自动会产生一个默认的拷贝构造函数。这个默认的拷贝构造函数采用的是“位拷贝”(浅拷贝),而非“值拷贝”(深...原创 2018-08-17 20:12:15 · 234 阅读 · 0 评论 -
全缓冲、行缓冲、无缓冲
首先,解释下什么是缓冲区?缓冲区的本质是一块存储区域。那么为什么要有缓冲区呢?当计算机的高速部件与低速部件通讯时,必须将高速部件的输出暂存到某处,以保证高速部件与低速部件相吻合。通常情况下,就是为了高效的处理我们的cpu和i/o设备之间的交互,因为我们知道cpu处理速度是很快的。举个例子,电脑的cpu通常情况下要处理很多事务,而我们从键盘敲下的文字相对于cpu的处理是很慢的,cpu不能...原创 2018-10-12 17:24:56 · 4809 阅读 · 1 评论 -
Linux下进度条代码
#include <unistd.h>#include <string.h>#include <stdio.h>int main(){ int i = 0; char bar[102]; memset(bar, 0 ,sizeof(bar)); const char *lable="|/-\\"; while(i <= 100 ){ ...原创 2018-10-12 17:50:39 · 199 阅读 · 0 评论 -
C++笔记--返回对象还是返回引用
我们发现,在C++中,有些成员函数返回的是对象,而有些函数返回的又是引用。返回对象和返回引用的最主要的区别就是函数原型和函数头。Car run(const Car &) //返回对象Car & run(const Car &) //返回引用返回对象会涉及到生成返回对象的副本,这事调用函数的程序可以使用的副本,因此,返回对象的时间成本包括了调用复制...转载 2018-05-20 15:07:01 · 3355 阅读 · 0 评论 -
深度探索c++对象模型学习笔记之对象
在c++中,有两种数据成员:静态的和非静态的,以及三种类成员函数:静态的、非静态的和虚函数。已知如下class Point声明:class Point{public: Point(float xval); virtual ~Point(); float x() const; static int PointCount();protected: vi...原创 2018-04-28 18:10:25 · 175 阅读 · 0 评论 -
while(ch=getchar()!=EOF)中的安全问题
如果有以下这样的代码:char ch;...while((ch=getchar())!=EOF){...}你是否考虑过它存在的安全问题?我们仔细分析下,getchar()返回int值,然后赋值给char 类型的ch变量,会造成截断,然后char 类型又升为整型和EOF比较。这段代码必然会导致一些安全问题。当这段代码运行在无符号字符集的机器上时,如果读取 了一个值为\377的字节时,循环就会被终止。...原创 2018-04-14 23:56:23 · 1689 阅读 · 2 评论 -
从文本内容中提取有效信息
例如a.txt中有如下内容$ABC,eqwe,0123,N,we23,E,234$ABD,fkjd,2454,N,fwer,E,456$AB,fhew,9478,N,wewf,E,rnju$ABC,wefn,9834,N,riwqj,E,42要求:提取的有效信息为eqwe,0123,we23wefn,9834,riwqj代码实现:#include<stdio.h>#include<...原创 2018-04-09 14:21:23 · 6755 阅读 · 0 评论 -
二维数组的动态创建
#include<iostream>using namespace std;int main(){ int **pArray; int row,col; cin>>row>>col;//输入行数和列数 //创建行指针? pArray=new int*[row]; //为每一行分配空间 for (int p=0;p...原创 2018-04-08 12:04:38 · 216 阅读 · 0 评论 -
SetConsoleOutputCP函数笔记
函数功能:API函数SetConsoleOutputCP用于设置控制台程序输出代码页。代码页是字符集编码的别名,也有人称"内码表"。早期,代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称。使用:#include <windows.h>#include <stdio.h>int main( void ){ SetConsoleOutputCP(936); ...原创 2018-04-08 12:03:26 · 6663 阅读 · 0 评论 -
PreCreateWindow笔记
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) // 先调用父类的PreCreateWindow return FALSE; // TODO: Modify the Window class or styles here...原创 2018-04-08 12:01:50 · 1326 阅读 · 0 评论 -
CObject::Dump(CDumpContext& dc )函数的学习
原型:virtual void Dump( CDumpContext& dc ) const;用途:将对象的内容转储到CDumpContext 对象中,用于诊断输出,用于转储的诊断性转储文本,通常为afxDump;示例:// example for CObject::Dump#ifdef _DEBUGvoid CAge::Dump( CDumpContext &dc ) con...原创 2018-04-08 11:58:22 · 1334 阅读 · 0 评论 -
vc6.0使用PathFileExists(...)函数的时候链接错误的解决办法
PathFileExists(...)函数使用的时候链接错误:error LNK2001: unresolved external symbol __imp__PathFileExistsA@4首先保证包含头文件“Shlwapi.h"之后可以有两种解决办法:方法一:在stdafx.h头文件中加入:#pragma comment(lib,"Shlwapi.lib")方法二:项目(Project)--...原创 2018-04-08 11:56:40 · 1475 阅读 · 0 评论 -
C++中隐藏、覆盖和重载的判断总结
原创 2018-04-08 11:52:34 · 158 阅读 · 0 评论 -
深入理解printf()函数中参数的处理顺序
#include<stdio.h>int main(void){ int a = 10, b = 20, c = 30; printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2)); return 0;}知识点:printf函数在处理参数的时候是从右向左处理的,即先处理(c = c*2),再处理(b = b*2),再...原创 2018-04-08 11:44:05 · 1690 阅读 · 0 评论 -
详解getchar()函数与缓冲区
1、首先,我们看一下这段代码:它的简单意思就是从键盘读入一个字符,然后输出到屏幕。理所当然,我们输入1,输出就是1,输入2,输出就是2。那么我们如果输出的是12呢?它的输出是1。这里我们先简单的解释下,因为当我们从键盘输入字符‘1’,‘2’,并按下回车后,我们的输入被放入了输入缓冲区,这个时候getchar()会从缓冲区中读取我们刚才的输入,一次只读一个字符,所以字符1就被拿出来了,赋值给了c,然...原创 2018-04-08 11:04:13 · 14973 阅读 · 7 评论 -
String类的构造函数、拷贝构造、拷贝赋值实现
class String { public: //构造函数 String(const char *str = NULL); //拷贝构造 String(const String &rhs); //拷贝赋值 String &operator=(const String &rhs); //析构函数 ~...原创 2018-04-10 11:54:29 · 514 阅读 · 1 评论 -
递归中的stack overflow(栈溢出)相关问题
很多同学在使用递归的时候,总是会出现这样的一个问题:在你的代码中,你写了一段递归调用,不幸的是这段递归调用产生了这样的一个问题。那么这是个什么问题呢?它又是为什么会产生的呢?我们看到提示是:Stack overflow,即栈溢出。我们知道在递归调用的时候,我们的参数、返回值等都会进行压栈、出栈操作,他们都在占用着计算机资源,准确点的说就是占用栈空间。大家有没有想过一个问题,这里的栈空间到底有多大?...原创 2018-04-22 14:11:06 · 4572 阅读 · 0 评论 -
内存对齐相关问题详解
目录:什么是内存对齐默认对齐数内存对齐原则为什么存在内存对齐内存对齐的实例详细解析例一:一字节对齐例二:二字节对齐例三:四字节对齐例四:八字节对齐例五:结构体嵌套的内存对齐1例六:结构体嵌套的内存对齐2内存对齐问题是笔试、面试中一个非常重要的问题,不仅在笔试、面试中很重要,它对于我们理解数据在内存中的存储也有很深刻的意义,所以在这里进行一次总结。...原创 2018-05-13 20:54:35 · 354 阅读 · 0 评论 -
柔性数组的使用
柔性数组柔性数组的特点柔性数组的使用柔性数组的优势柔性数组在c99中,对于结构体中的最后一个成员,可以允许最后一个成员是未知大小的数组,这样的数组就叫做柔性数组。typedef struct st_type{ int i; int a[0];}type_a;某些编译器对于这种写法会报错,我们可以改写为下面的形式:typede...原创 2018-05-12 18:25:49 · 3284 阅读 · 0 评论 -
动态内存管理的经典面试题解析
在学习这几个经典的面试题之前,先给大家解释几个名词: 1.空指针:简单的代码表现就是p=NULL(p为一个指针),空指针没有指向任何内存块,它里面存的值为0;2.内存释放:在我们动态的申请了内存之后,当我们使用完了这块内存,我们需要把申请的这块内存还给我们的操作系统,而不是一直占用。而释放的本质就是这块内存被标注为可以被其它应用程序使用,而内存申请后这块内存对于其它应用程序来说就被标注为已占...原创 2018-05-12 16:46:48 · 353 阅读 · 0 评论