
C语言
文章平均质量分 53
宇龍_
有些白嫖党连个赞都不点甚至直接抄走了说原创,新发布的都写到专栏里吧,哎。
私聊给群号,可进Q群咨询问题。
展开
-
由联合体union引出的大小端问题
由联合体union;大小端问题原创 2022-08-07 05:00:00 · 205 阅读 · 0 评论 -
C/C++中的静态变量注意事项(很多人都会踩坑,甚至现在还不明白)
静态变量注意事项;踩坑原创 2022-07-26 22:54:42 · 1068 阅读 · 0 评论 -
C/C++初始化字符数组的方式对比,{0}是否存在问题?
前言:一般我们在C/C++中有两种常见的初始化字符数组的方式,如下://第一种char szBuff[64] = {0};//第二种char szBuff[64];memset(szBuff,0,sizeof(szBuff));那么这两种谁更优?谁更安全?一般稳健一点的人可能会选择使用后者,毕竟自己memset了,有的人可能认为第一种方式只是将第一个字符置空,而其位置并未初始化,这样写效率高。其实并非如此,让我们从汇编层面来分析一下。分析过程:第一种:c原创 2022-05-24 23:26:36 · 903 阅读 · 0 评论 -
do{}while()的妙用
有时候在代码中经常看到do{}while(0),do{}while(false)这种看起来有点奇怪的形式,实际上在项目中使用这种方式是非常妙的,可以减少函数逻辑中很多return或者多层嵌套if...else...的形式,可以很简单的实现在函数中只有一个return,见如下代码:#include <stdlib.h>#include <stdio.h>//权限校验函数bool DoCheck(int n){ bool bRet = false; do {原创 2022-04-16 14:25:45 · 636 阅读 · 0 评论 -
WDK开发入门1-基础环境搭建和第一个驱动程序(VS2010)
1、先安装vs20102、安装WDK76003、在vs2010中创建一个空项目,命名为MyDriver4、点击生成,选择配置管理器,添加解决方案配置5、切换视图到属性管理器右键添加项目属性表打开项目文件夹下的MyDriver.props文件,进行编辑将以下代码复制到MyDriver.props中,并修改WDK的安装路径<?xml version="1.0" encoding="ut...原创 2022-03-21 22:17:20 · 4104 阅读 · 0 评论 -
复习memcpy函数的代码实现
void* memcpy(void* pvTo, const void* pvFrom, size_t size){ assert((pvTo!= NULL) && (pvFrom!= NULL)); unsigned char* pbTo = (unsigned char*)pvTo; unsigned char* pbFrom = (unsigned char*)pvFrom; while(size-- > 0) { *pbTo++ = *pbFrom++; }.原创 2022-03-09 10:04:15 · 472 阅读 · 0 评论 -
C/C++实现关闭命令行快速编辑模式(Windows系统)
背景:开发了一个程序,需要通过cmd命令行来运行该程序,但在多次使用后发现,有时候程序会卡住,必须要按回车程序才会输出,网上搜索了一番,发现这是由于命令行窗口的快速编辑模式导致的,我希望能在调用我的程序时,该模式就被关掉,而不是让用户手动关闭。方案:在主函数开头加入几行代码即可:HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);DWORD mode;GetConsoleMode(hStdin, &mode);mode &=原创 2022-01-12 15:41:05 · 1968 阅读 · 1 评论 -
指针的值传递
指针的值传递和变量的值传递一样,当参数是指针的时候,在函数内部只是对指针修改,那是没有意义的。下面看一个例子:void GetInt(int *pInt){ pInt = new int;}void FreeInt(int *pInt){ if(pInt) delete pInt;}int main(){ int *p1 = NU...原创 2019-10-20 18:17:23 · 9775 阅读 · 0 评论 -
数组名和数组名取地址的区别
以下代码会打印出什么样的日志呢?#include <stdio.h>int a[2] = {1,2};int main(){ printf("a = %p\n", a); // I printf("&a = %p\n", &a); // II printf("a + 1 = %p\n", a + 1);// I......原创 2019-01-15 21:31:21 · 346 阅读 · 0 评论 -
指针相加减
下面举一个非常简单的例子来进入这个话题:int main(){ int a[5]; int *p1 = &a[0]; int *p2 = &a[4]; printf("%d \n", p1); printf("%d \n", p2); printf("%d \n",p2-p1);}这个程序运行的结果,对于不了解指针的...原创 2019-06-01 11:55:34 · 10681 阅读 · 0 评论 -
二维数组的本质
在C/C++中无论是几维的数组,那必然是连续的内存空间。那对于二维数组,是怎么解释的呢?我们可以这样理解:实则上二维数组也是一个一维的数组,比如int a[5][4] ,这个数组的长度是5,每一个元素又都是一个数组int[4]。从以下代码可以证明二维数组是连续空间,而且正如上面描述的那样:int main(){ int a[5][5]; for (int i...原创 2019-06-02 22:08:30 · 11329 阅读 · 0 评论 -
多条件编译指令的使用
//#define MYTEST//#define MYTEST1//#define MYTEST2int _tmain(int argc, _TCHAR* argv[]){#ifdef MYTEST printf("MYTEST \n");#elif defined(MYTEST1) printf("MYTEST1 \n");#elif defined(MYTE...原创 2019-08-13 19:16:50 · 9598 阅读 · 0 评论 -
回调函数妙用-函数指针
话不多说,上来就是一段代码,之后解释#include "stdafx.h"//定义回调函数类型typedef void(*_CALLBACK)(void *pUser);//设置回调函数void gFunc(_CALLBACK fun,void *pUser){ fun(pUser);}//测试类class Test{public: Test():...原创 2019-08-12 21:58:33 · 10218 阅读 · 0 评论 -
stdcall和cdecl函数调用约定详解
前言看了网上各种关于stdcall和cdecl五花八门的解释,看了后让人初学者完全懵逼,甚至怀疑人生。这里我用通俗易懂的方式,给大家讲解一下原理。首先理解一个知识点,要知道前人为什么要这样做,而不那样做?优点?stdcall和cdecl都是函数调用约定之所以有不同的约定是由于历史原因,而且不同的编程语言有不同的调用约定,若要跨语言调用,则必须要了解函数调用约定。函数调...原创 2019-08-17 21:19:10 · 10517 阅读 · 0 评论 -
strrchr和strchr用法
函数原型const char* strchr(const char *_string, const int_ch);const char* strrchr(const char *_string, const int_ch);作用从字符串中搜索某个字符第一次出现的位置,返回指向该字符的指针。strchr是正向搜索,strrchr反向搜索(从右往左搜)。参数 ...原创 2019-08-26 21:38:39 · 11093 阅读 · 0 评论 -
一道有趣的C语言面试题
今天在吃晚饭的时候玩儿手机,无意间看到一道题,出处未知。这里来考考大家^_^: signed char a = (unsigned char)-1; unsigned char b = a; int c = a; int d = b; printf("%d %d %d %d", a, b, c, d);求输出?各位不用敲代码,猜猜看?...原创 2019-08-28 22:21:59 · 9890 阅读 · 0 评论 -
符号扩展
符号扩展是指计算机对于小字节转换成大字节的规则。比如char(1字节)转换成int(4字节),多出来的3个字节到底填充什么?规则如下:当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0,即全填充0。上面那句话的本意是指:负数扩展后,还是负数,且值不变;正数扩展后还是正数,值不变。看似简单的一句话,可常在面试中让人困惑不已...原创 2019-09-09 20:29:33 · 24267 阅读 · 2 评论 -
memset陷阱
1、不能用memset操作对象memset甚至会修改虚表指针以下代码会崩溃:class Base{public: virtual void test() { printf("base \n"); }};class Test:public Base{public: virtual void test() { ...原创 2019-09-23 19:57:13 · 10002 阅读 · 0 评论 -
static关键字总结
1.隐藏。(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。加了static的变量或者函数则只是当前文件可见,所以可以利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)存储在静态数据区的变量会......原创 2019-05-31 21:43:32 · 318 阅读 · 0 评论 -
extern的作用
1、声明外部的变量 由于编译是对单个的文件进行编译,所以在编译一个a.cpp文件的时候,若是要在a.cpp中使用b.cpp中的变量,直接使用则编译肯定会报错的,所以这个时候应该永extern修饰在a.cpp中所使用的b.cpp中的变量,这个时候编译器会忽略这个错误,直到链接的时候("将文件融为一体")会找到b.cpp中的变量,这样便ok了。extern的作用相当于让编译器在编译阶段忽...原创 2019-05-30 22:14:21 · 13558 阅读 · 0 评论 -
数组名和数组名取地址的区别
直接上demo,代码如下:int main(){ int arr[10]; printf("%d \n", &arr); //7338716 printf("%d \n", arr); //7338716 printf("%d \n", &arr[0]); //7338716}在上面的代码中,打印出来的结果都是一样的。但是...原创 2019-05-24 22:28:34 · 10105 阅读 · 0 评论 -
strcpy和memcpy的区别与实现
strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。strc......原创 2019-03-15 16:06:12 · 336 阅读 · 0 评论 -
==需要注意的
原创 2019-03-06 23:33:34 · 143 阅读 · 0 评论 -
C语言常用函数——笔试常用
在公司笔试时经常需要调用或者实现c语言中的一些函数。主要包括:1、字符串处理函数。2、内存操作函数。字符串处理函数:size_t strlen(const char *s);/*功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’参数:s:字符串首地址返回值:字符串s的长度,size_t为unsigned int类型*//*char *strcpy(char *de...原创 2019-03-06 23:12:43 · 10362 阅读 · 0 评论 -
C/C++ 中 const 修饰符用法总结
const修饰符,是平时编程中经常用到的,也是面试容易出现的基础题,故非常有必要来一个全面的总结——共9个要点。 const 用法总结const 变量 const int a; 不能修改值,必须初始化 const 类对象 const MyClass a; 不...原创 2019-03-06 22:49:45 · 354 阅读 · 0 评论 -
static函数与普通函数有什么区别
static函数与普通函数的区别: 用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数......原创 2019-01-08 22:34:38 · 12623 阅读 · 0 评论 -
C语言(复杂类型的指针)
复杂类型的指针的难点在于:函数指针返回值为函数指针时,函数指针参数为函数指针时,以下均有相关例子。例如:char (*fp)(char *,int *);定义一个名为fp的函数指针,其类型为:输入两个参数,int *型和char *型,返回参数类型为char1. int *pf(float (*a)(int));2. int (*pf(char *))[5];3. char *(*p...转载 2019-01-03 14:10:50 · 1083 阅读 · 1 评论 -
void关键字的使用规则
规则一如果函数没有返回值,那么应声明为void类型 规则二如果函数无参数,那么应声明其参数为void。 规则三小心使用void指针类型按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:void * pvoid;pvoid++; //ANSI:错误pvoi...转载 2018-12-19 15:24:56 · 328 阅读 · 0 评论 -
c/c++使用{}初始化数组需要注意的(2)
c/c++语言中,数组初始化的方式主要有三种:1、声明时,使用 {0} 初始化;2、使用memset;3、用for循环赋值。这次我们重点关注第1点,我们来看下面的代码int main(int argc, char *argv[]){ int a[10]; for(int i=0;i<sizeof(a)/sizeof(int);i++) ...原创 2018-12-19 14:12:00 · 405 阅读 · 0 评论 -
C/C++不用std::to_string的方式实现整数转字符串
今天使用在项目中需要用到整数转字符串,平时直接std::to_string就搞定了,但是由于项目比较久远,而std::to_string是在c++11中才开始支持的,所以想到了用atoi函数来转换,但遗憾的是在linux下似乎没有该函数,通过查找相关资料,看到了有如下方法实现该转换——sprintf函数 char str[20]; sprintf(str, "%d*%d",100,666)...原创 2019-04-04 16:51:37 · 2224 阅读 · 0 评论 -
关于printf和sprintf打印或者格式化字符时需要注意的
今天在使用sprintf格式化字符串的时候是这样做的 unsigned int i = 88; char buf[20]; sprintf_s(buf, "%d", i); std::cout << buf << std::endl;程序运行结果:这样做看似没有问题,但实际上会出现较大的问题。原因在于%d是格式化有符号整型。看以下代码 unsi...原创 2019-04-04 20:06:24 · 906 阅读 · 0 评论 -
C语言指针加1
C语言中的指针加1并不只是简单的地址加1而已,实际上指针加1,地址偏移的多少是与指针的类型相关的。demo如下:int main(){ char arr1[10]; char *p1 = &arr1[0]; printf("%d \n", p1); printf("%d \n", p1+1); //p1+1地址偏移了一个sizeof(char) int arr2...原创 2019-05-24 21:41:55 · 14977 阅读 · 0 评论 -
怎么样连接两个char*型的字符串变量(字符串拼接)
主要使用两个函数strcat和strcpystrcat本身就是连接字符串的,但是要保证空间足够。int main(){ char buff[1024]; memset(buff, 0, sizeof(buff)); const char *buff2 = " test"; strcpy(buff, "abc"); strcat(buff, buff2); printf(...原创 2019-05-19 11:41:39 · 30212 阅读 · 0 评论 -
C/C++获取时间及时间格式转换
window下#include "windows.h"int main(){ SYSTEMTIME s_time; GetLocalTime(&s_time); printf("%04d %02d-%02d %02d:%02d:%02d", s_time.wYear, s_time.wMonth, s_time.wDay, s_t...原创 2019-05-19 11:05:17 · 1329 阅读 · 1 评论 -
用c语言如何在数字前自动补0
在我们需要格式时间格式的时候会用到这点int a=1;printf("a=%04d\n",a);//输出6位十进制整数左边补0,显示a=0001比如这个%04d的0就是指在前面补0占位,4代表位宽。一般这两个要一起用。当然,当数字本身长度比宽度长的话,那这就不起作用了,如a=12345;那么输出也是 a=12345...原创 2019-05-19 09:55:59 · 43917 阅读 · 4 评论 -
C++中placement new操作符(经典)
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; }首先我们区分下几个容易混淆的关键词:new、......原创 2019-04-29 22:59:49 · 1394 阅读 · 0 评论 -
char[0]不是你想用想用就能用
前言新了解char[0]的少年们很愉悦的将其应用到了项目中,多看一条注意事项可以减少不必要的痛苦。引言在C语言中char[0]是一种数组的特殊用法,用于标记一个指针在一个结构体最后:例如:struct node{int number;//后面的数据长度char data[0];//这是一个指针,不占空间}sizeof(node)就等于sizeof(int);更......原创 2019-04-14 21:42:32 · 13644 阅读 · 0 评论 -
c/c++获取时间戳以及毫秒计算
1、获取利用time函数当前的时间戳(秒)#include <iostream>#include <time.h>using namespace std;int main(){ time_t t; time(&t); cout << t << endl; return 0;}2、毫秒级...原创 2019-04-14 13:18:31 · 10336 阅读 · 4 评论 -
C语言中“&=,^=,|=”分别表示什么意
C语言中“>>=,<<=,&=,^=,|=”分别表示什么意思?1、C语言中的 >>= 意思为:右移后赋值代码示例为:x = 8;x >>=3;右移后结果为:000000000000000000000000000000012、C语言中的<<= 意思为:左移后赋值代码示例为:x ...转载 2019-04-09 20:09:32 · 142456 阅读 · 5 评论 -
c/c++初始化数组需要注意的(1)
C语言中,数组初始化的方式主要有三种:1、声明时,使用 {0} 初始化;2、使用memset;3、用for循环赋值。 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:#define ARRAY_SIZE_MAX (1*1024*1024) void function1(){ char array[ARRAY_SIZE_MAX] = {0}; /...转载 2018-12-19 13:51:07 · 687 阅读 · 0 评论