C语言
Hello_MyDream
这个作者很懒,什么都没留下…
展开
-
C/C++面试题
一.为什么构造函数不能使用virtual关键字修饰?1、虚函数是为了迟绑定吧,为什么要迟绑定?因为好多行为编译期确定不了,需要运行期确定并调用合适的函数去完成相应的功能。但是对象构造的行为是确定的,不管是不是多态,只要有new Object()这种动作,就一定会沿着继承的顺序依次执行对象的构造。这种确定的没有必要的事情,编译器开发的时候也就不会考虑这种机制。2、构造函数是用于创建对象的,而虚函数是对象创建后地址存在虚函数表中的,此时对象尚未创建,无法使用虚函数。实际上我是不认可第二个回答的原创 2020-10-23 19:49:53 · 263 阅读 · 0 评论 -
gcc添加环境变量
1、使用QT中的GCC来添加环境。2、在path新建环境变量添加:Qt\Tools\mingw530_32\bin后点击确认键。3、关闭命令行后重新打开即可。原创 2020-09-08 14:03:37 · 2586 阅读 · 0 评论 -
调用约定
调用约定函数的调用约定就是:描述参数是怎么传递和由谁平衡堆栈的。__stdcall __cdecl __fastcall调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX传送前两个,剩下:从右至左入栈 自身清理堆栈 ...原创 2020-07-09 22:54:08 · 26239 阅读 · 0 评论 -
Window线程安全与线程控制函数
一. 线程安全问题多线程同时访问全局变量:一个线程取值后失去CPU另一个线程取值后也失去CPU,此时它们保存的就是相同的值。也是是说,比如两个线程再次对全区变量做++操作时变量只会被修改为同样的值。二. 临界区(线程锁)临界区:Critical Section (Critical:临界的、关键的)1、创建CRITICAL_SECTION: CRITICAL_SECTION cs; 2、在使用前进行初始化 ...原创 2020-06-21 03:17:52 · 27009 阅读 · 0 评论 -
Window线程与线程操作函数
创建线程HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, &a, 0, NULL);HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性 通常为NULL SIZE_T dwStackSize, // 参数用于设定线程可以将多少地址空间用于它自己的堆栈原创 2020-06-21 02:58:58 · 26852 阅读 · 0 评论 -
C语言宽字符
一. 多字节字符1. 基于ASCII的GB2312标准ASCII表 0 ~ 127拓展ASCII表 0 ~ 255GB2312 10000000 ~ 11111111(高位) + 10000000 ~ 11111111(低位) 问题:不同国家的字符集会产生乱码2. 基于UNICODE的UTF-8UNICODE(同一码 / 万国码):unicode是2个字节。 这一标准的2字节形式通常称作UCS-2(UnicodeCharacterSet)(原ASCII也位双字节)。然而,受..原创 2020-06-17 14:39:59 · 30388 阅读 · 0 评论 -
C语言中sizeof测试数组指针大小问题
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int main(int argc, char *argv[]){ int arr[5] = {1, 2, 3, 4, 5}; int(*p)[5] = &arr; //typedef与赋值操作不能同时使用。 type...原创 2018-10-22 21:11:40 · 33181 阅读 · 0 评论 -
对数组名取地址赋值给数组指针与普通指针的区别
对数组名取地址赋值给数组指针与普通指针的区别:以下红色字体的说法是错误的: 使用一级指针来接受&arr,只是表示一个普通的一级指针, 它并没有接收到&arr赋来的跨度,而只接收到了地址而已。所以, p1的跨度只有4个字节。它保存的地址所表示的是arr这个数组的首元素地址 相当于在赋值过程中,&arr退化为了arr,失去了数组本来拥有的跨度...原创 2018-10-22 22:47:23 · 31950 阅读 · 0 评论 -
联合体共用内存问题
联合体成员变量共用同一块内存空间。联合体中,每个成员所能操作的空间由成员类型决定。window下,字节是倒序存储的,即低字节在后面,高字节在前面。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>union DATA{ char a; short b; int c...原创 2018-10-25 20:06:47 · 29327 阅读 · 0 评论 -
数组维度以及数组名作为右值
一.使用一级指针、一层循环遍历一维数组这个不必多言,此时的数组名即为一级指针常量。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int main(int argc, char *argv[]){ int arr1[5] = { 1, 2, 3, 4, 5 }; int...原创 2018-10-23 12:10:41 · 28853 阅读 · 2 评论 -
结构体指针数组及堆区空间的多次开辟与释放顺序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct { int age; char *name;}STU;int main(int argc, char *argv[]){ STU **arr...原创 2018-10-23 14:47:49 · 29384 阅读 · 0 评论 -
定义指针变量时*的位置
在定义指针变量时一般有如下两种书写习惯:1. int **p;2. int** p;而int **p这种方式是普遍适用的,那么它就一定存在着某些优势:1. 有人会觉得,第二种写法把类型写在前面其实会更加明了,其实不然。我们从操作符与结合性的角度分析一下int **p的原理就可以得知了:首先与*结合,表示p是一个指针变量,它保存了一个地址(指针);*p就是取出这个地址所指向...原创 2018-10-23 19:07:53 · 31680 阅读 · 1 评论 -
C语言中静态库函数和动态库函数的创建以及调用
C语言中调用动态库函数的两种方式方式一.隐式调用将动态库的相关文件拷贝到当前目录下(lib、dll),然后添加以下代码,在程序中指定连接库函数。注意:第二个参数给出的是引入库文件(或称“导出库文件”),而不是dll。在程序运行过程中,lib将dll中需要用到的函数映射到对应的内存空间。#pragma comment(lib, "./mydll.lib")方式二.显示调用...原创 2018-10-26 14:32:31 · 36477 阅读 · 0 评论 -
C语言IO函数总结
一.只用于标准输入(stdin)和标准输出(stdout)的函数1.getchar putchar2.gets putsgets:从标准输入读字符。直到出现换行符或读到文件结尾为止。不会检测空间是否足够,会造成空间越界。 puts:向标准输出设备输出一个字符串,会自动添加换行符。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h...原创 2018-10-24 15:56:17 · 34533 阅读 · 0 评论 -
C语言常见问题总结
一.为什么不能在变量声明时对其进行赋值?变量的声明为:在变量已经存在的情况下,去告诉别人这个变量的存在。变量的声明不会再给变量开辟空间了。二.数组的下标为什么从0开始?1. 数组的出界点即代表数组元素个数,出界点不在数组下标范围内,即不对称边界:[0 , n)。2.因此我们可以将迭代时的条件记为i < n;而不是i <= n - 1;。三.浮点型在内存中的存储方...原创 2020-09-14 10:19:35 · 3245 阅读 · 0 评论 -
函数指针以及指针的高级用法
一.声明1.首先需要更新一下对于声明的理解:int *f;我们可以将其看做两部分:一是数据类型,而是声明表达式。对声明表达式求值就会返回一个给定类型(这里为int类型)的值。2.之后我们还要区分旧式的声明与新式的声明:以上给出的就是一个旧式的声明方式,而ANSI C要求要求我们使用完整的函数原型进行声明,使声明更为明确。即还需要给出函数的参数类型,如下例所示:int *f(...原创 2018-11-11 22:18:48 · 29546 阅读 · 0 评论 -
C语言可变参数
C语言可变参数可以使用宏函数取出,宏函数在头文件stdarg.h中。贴出如下简单的代码,博客转载自: https://www.cnblogs.com/edver/p/8419807.html亦可参考:https://www.cnblogs.com/ThatsMyTiger/p/6924462.htmlint simple(int num,...){ int i, r...转载 2019-02-14 11:38:27 · 29031 阅读 · 0 评论 -
*p++
*p++是一个比较经典的运算符相关问题,主要注意以下两点:1. 单目运算符结合律由右向左,先计算++再进行取值。2. 如果要对值进行++运算的话那么就要先取值,后运算:(*p)++。...原创 2019-03-09 19:15:12 · 28449 阅读 · 0 评论 -
C语言中有符号数与无符号数的加法运算
C语言中的自动类型转换:在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换,即隐式类型转换。一般是占用内存字节数少类型,向占用内存字节数多的类型进行转换,以防止精度丢失。C语言中有符号数与无符号数的加法预算:unsigned int与int相比,拥有更大的正数范围。所以,无符号数与有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,...原创 2018-09-05 22:10:20 · 39974 阅读 · 0 评论 -
C语言浮点型字面值常量的书写形式
C语言浮点型字面值常量的书写形式:浮点数字面量总是写成10进制的形式。 浮点数字面量必须有一个小数点或一个指数。如:1e10。 浮点数字面值在缺省情况下都是double类型的。 ANSI标准规定的浮点数所能容纳的最小范围是10e-37~10e37之间的任何值。 ANSI标准规定了long double至少和double一样长,double至少和short一样长。 以下代码给出了几种浮...原创 2018-10-10 20:44:05 · 34737 阅读 · 0 评论 -
字符常量在vs中显示的int值原理
如以下代码所示,在vs中将光标放在常量'11'上时,就会显示(int)12593这个数值。我们就以此为例,分析下这个数值的由来:字符1在对应的ASCII值为49,那么在内存中就是0011 0001,两个1在内存中的二进制形式就是0011 0001 0011 0001,如果将这个数值换算为10进制的话,就是12593了。#define _CRT_SECURE_NO_WARNINGS#incl...原创 2018-10-10 19:49:47 · 29495 阅读 · 0 评论 -
C与指针笔记第三章
第一节:基本数据类型C语言仅有四种基本数据类型: 1.整型 2.浮点型 3.指针类型 4.聚合类型一.整型(九种) 1.字符 char signed char unsigned chars 2.短整型 signed short int unsigned shor...原创 2018-10-19 20:47:18 · 27840 阅读 · 0 评论 -
C语言中的malloc与free函数
C语言中的malloc与free函数malloc函数的作用是在堆中开辟一块指定大小的空间。如果开辟成功,返回空间首个字节地址,失败则返回NULL。free函数能够释放在堆中开辟的内存空间,传入一个任意类型的指针变量,指向指向被释放区域的首地址。被释放区域应是有malloc开辟的空间。需要注意的是:free释放内存空间只是失去了对地址的操作权限,并没有保证清理内存空间。free是否能...原创 2018-09-12 23:07:56 · 30299 阅读 · 0 评论 -
C语言中的printf函数
不论printf函数的参数是一个还是多个,必须有一个含有字符串,即必须使用双引号。printf()会根据参数format字符串来转换并格式化数据,并将结果输出到标准输出设备,直到字符串结束('\0')为止。所以字符串参数在printf函数中是必不可少的,如若不然,就会在出现运行时错误(不同于Java的自编译,C语言编译器不会文本保存时对编辑好的代码做语法检查)。正如以下代码所示:#def...原创 2018-09-06 14:39:32 · 31044 阅读 · 0 评论 -
C指针一:指针变量提取内容的宽度和指针变量+1的跨度
指针变量提取内容的宽度和指针变量+1的跨度:指针变量所提取的内容宽度,由指针变量所指向的类型长度决定。就是说,指针变量之所以知道要从指定位置取出几个字节,是由指针变量所指向的类型决定,现在这个类型就是int,与所保存的地址对应的变量类型一致,所以就正好取出其内容。、指针变量+1的跨度,也是由指针变量所指向的类型决定的。通过以上两点总结,给出对应的如下代码:#define _CRT...原创 2018-09-09 21:48:03 · 29194 阅读 · 0 评论 -
C语言中的NULL与转义字符'\0'以及数值0的关系
以下两种只是一个巧合,只不过地址值的数值为0而已。0本身只不过是一个可以显示的字符,与内存并没有直接关系。在0与ASCII表中关联NULL做了关联,这样使得输入转义字符'\0',也可以将一个变量赋值为NULL。而'\0'对应的ASCII码又是第0号,char类型本质上就是int,运算时也会自动转换为int类型,所以'\0'与数字0的值也恰好相等。#define _CRT_SECURE_NO_...原创 2018-09-09 20:26:48 · 32316 阅读 · 1 评论 -
C语言中变量的声明及使用
变量:在程序运行过程中,其值可以发生改变的量。变量名仅代表变量的内容,而并不代表变量的地址。变量的定义:变量在使用前必须先定义,定义变量前必须有相应的数据类型。定义变量,即让变量存在,系统会根据变量的类型来开辟空间。 变量定义的同时往往伴随的就是变量的初始化,即在定义变量的同时给变量赋值;如果没有在定时及时赋值,那么系统就会一个随机的值。注意,在变量定义之后再进行的赋值操作,不是初始...原创 2018-09-02 13:17:50 · 32037 阅读 · 0 评论 -
C语言中数组的首元素地址和首地址
C语言中数组的首元素地址和首地址:虽然首元素地址和首地址在数值上是相同的,但是它们所表示的意义却不相同:数组的首元素地址:表示数组的首个元素的地址。 数组的首地址:表示整个数组的地址。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int main(int argc, ...原创 2018-09-07 20:26:38 · 63667 阅读 · 5 评论 -
C语言中,对基本类型操作时数据的溢出
C语言中,对基本类型操作时数据的溢出:以char类型为例,如下图所示:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<math.h>int main(int argc, char *argv[]){ char ch = 0; /*此时已经...原创 2018-09-05 08:34:44 · 30511 阅读 · 0 评论 -
编辑器和编译器和区别g、gcc分步编译、system命令的使用
一,编译器和编辑器的区别编辑器:即编写代码的工具,方便人对程序的操作和管理如窗口系统中的记事本以及Linux的系统中的VI / vim的都是编辑器。编译器:将高级计算机语言程序翻译为计算机能解读,运行的低级机器语言程序。就是说,我们用编辑器编写程序,由编译器编译后才可以运行!二.gcc分步编译预处理:宏定义展开,头文件展开,条件编译,删除注释在这里并不会做任何语法的检查.gcc...原创 2018-09-01 19:49:28 · 33407 阅读 · 0 评论 -
C语言中的变量
一.普通局部变量:局部变量无论是否静态均不允许同名,否则会出现error;当局部变量与全局变量同名时,依据就近原则进行判断。局部变量同名是指在复合语句的嵌套中,内层复合语句变量与外层复合语句变量同名,这样是允许的。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(int argc, char *argv[])...原创 2018-09-13 00:12:23 · 29754 阅读 · 0 评论 -
C语言中的联合体集体赋值问题
联合体的集体赋值在vs编辑器的检查中会报错,在gcc中会给出警告:vs环境下:gcc中:原因在于:联合体开辟空间的大小是联合体成员中空间最大的成员的字节数。然而这种赋值,超过了联合体开辟空间的的范围。 ...原创 2018-09-17 21:40:27 · 32406 阅读 · 0 评论 -
C语言中一维数组与二维数组的比较
C语言中一维数组与二维数组的比较:从效率上讲:一维数组访问一个数据时,只需要查找与数组元素对应的地址,通过地址匹配到目标元素。 二维数组则需要先找到目标元素数组的地址,匹配到目标元素数组,然后再对此元素数组重复此操作,从而找到目标元素。 修改数组元素也是同理。 所以,在存储数据相同的基础上,很显然一维数组的效率是高于二维数组的。从程序设计与可操作性的角度考虑,二维数组及多维数组就体...原创 2018-09-07 13:49:38 · 34587 阅读 · 0 评论 -
8进制转义字符与16进制转义字符的相关问题
8进制转义字符:\ddd16进制转义字符:\xddd。一般给出的是2位16进制,但实际上是三位。但因为第三位没有实际意义,所以通常省略。如果结果值超出的表示字符的范围,此时结果就是未定义的(字符)。在vs中就会出现C2022错误,gcc会给出警告。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<s...原创 2018-10-10 16:56:17 · 31114 阅读 · 0 评论 -
使用#include将一个函数定义在两个源文件中
使用#include将一个函数定义在两个源文件中:这是使用了#include的不合理用法,将一个文件中的内容包含到一个函数当中,使得在两个文件中也能够定义一个函数。当然,这种函数的定义方式是不被推荐的。main.c文件中:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>...原创 2018-10-10 16:37:08 · 29757 阅读 · 2 评论 -
C语言中的四种作用域
C语言编译器可以确认四种不同类型的作用域:一.代码块作用域。在K&R C中,函数形参的作用域始于形参的声明处,位于函数体之外如果函数体内部声明了名字相同的局部变量,他们就将隐藏起来;ANSI C遏止了这种错误的可能性,它把形参的作用域设置为整个函数体。二.文件作用域。任何在代码块之外声明的标识符都具有文件作用域。但是在同文件中编写的通过include指令包含到其他文件中的声...原创 2018-10-13 09:41:24 · 38147 阅读 · 0 评论 -
C语言中的位运算符
C语言中的位运算符: char a = 1; char b = 0;按位取反:~ printf("%d\n", ~a);//-2 按位与:&(逻辑乘法):遇0则0 printf("%d\n", a & b);//0 按位或:|(逻辑加法):遇1则1 printf("%d\n", a | b);//1 按位异或:^:相同为0,不同为1;...原创 2018-10-12 19:55:05 · 29080 阅读 · 0 评论 -
变量交换的四种方式
可以使用以下方法对两个变量进行交换:方法一:定义一个中间量。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int main(int argc, char *argv[]){ int a = 10; int b = 20; int temp = 0; temp ...原创 2018-09-22 18:30:34 · 1483 阅读 · 0 评论 -
C语言中变量的存储类型
C语言中变量的存储类型:变量的存储类型:是指存储变量值的内存类型。 变量的存储类型决定了 变量何时创建、何时销毁、保持多久。 有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器。变量的缺省(default,同默认)存储类型时,取决于它声明的位置。在任何代码块之外声明的变量总是存储的静态内存中,被称为静态变量,在程序运行之前创建。 在代码块内部声明的变量的缺省存储类型是自动的,...原创 2020-09-14 10:18:56 · 714 阅读 · 0 评论 -
C语言整型声明方式及说明符
C语言整型声明方式及说明符:说明符:包含了一些关键字,用于描述被声明的标识符的基本类型。如:signed long int等。 signed关键字一般只用于char类型,因为其他类型在缺省的情况下都是有符号数,signed将这个范围扩至-127~127。而char的默认范围因编译器而异。所以char可能等于signed char(在vs和gcc中默认为signed char),也可能等于un...原创 2018-10-11 14:10:28 · 33111 阅读 · 0 评论