C/C++
文章平均质量分 82
C/C++
一只嵌入式爱好者
去经历挫折,去感受失败
展开
-
回车和换行的区别
需要注意的是在Windows系统中回车键被当做\r\n的组合来使用,当我们从键盘输入回车键时,Windows系统会把回车键当做\r\n来处理,Unix系统只会当做\n来处理,不管在什么系统中,都可以用\n来作为一行输入结束的标记,只是在编程时我们需要注意,在Windows系统中我们会读到\r这个字符,我们必须把\r和正常输入的字符区别开来。如果同时出现,则去掉’\r’,如果没有同时出现,保留’\n’。只要在Unix文件中出现的’\n’的之前加入一个’\r’字符就可以了。...原创 2022-07-31 16:32:02 · 3143 阅读 · 1 评论 -
程序中的负数存储及类型转换
分为:正数 和负数(包括正浮点数,和负浮点数)。规定最高位位符号位正数为0,负数为1(原因下文解释)原码:10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)。反码:正数的反码是本身,负数的反码是负数的原码0变为1,1变为0 (-1的原码是1000 0001 它的反码就是 1111 1110,)。(注意负数求反码时候的符号位不参与变换)。补码:正数的补码是本原创 2022-06-30 16:49:47 · 1631 阅读 · 0 评论 -
new和malloc的区别
new和malloc的区别转载 2022-06-29 21:41:03 · 783 阅读 · 0 评论 -
全局变量和静态变量的初始化
首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中原创 2022-06-29 09:40:17 · 3375 阅读 · 0 评论 -
数组、链表和哈希表
数组、链表和哈希表数组、链表和哈希表关系数组与链表的区别链表总结链表开源库—utlist.h哈希表开源C库—uthash简介uthash能做什么uthash包括的额外内容uthash效率简单使用定义hash数据结构从hash表查找item向hash表添加item从hash删除item数组、链表和哈希表关系数组与链表的区别(1)存储空间上链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数据时,数组占用较小的内存,而链表还需要存放其前驱和后继的空间。原创 2022-03-20 21:27:02 · 2149 阅读 · 0 评论 -
C编程每日一练
C编程每日一练2022.3.17两数之和题解方法一:暴力枚举思路及算法:代码复杂度分析方法二:哈希表(空间换时间)思路及算法代码复杂度分析2022.3.17两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:原创 2022-03-19 17:49:32 · 222 阅读 · 0 评论 -
匈牙利命名法、驼峰式命名法、帕斯卡命名法
匈牙利命名法、驼峰式命名法、帕斯卡命名法匈牙利命名法驼峰式命名法小驼峰式命名法大驼峰式命名法(帕斯卡命名法)匈牙利命名法优缺点优点缺点其他匈牙利命名法基本原则是:变量名=属性+类型+对象描述。开头字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,要求单词第一个字母大写。例如:int iMyAge; //“i”是int类型的缩写;char cMyName[10]; //“c”是char类型的缩写; float fMyHeight; //“f”是float类型的缩写;匈牙利命名法中常原创 2022-03-08 15:22:41 · 1662 阅读 · 0 评论 -
C函数库(libc、glibc、uClibc、newlib)
libc、glibc、uClibc、newlibglibc和libcuClibcNewlibglibc和libcglibc和libc都是Linux下的C函数库,libc是Linux下的ANSI C的函数库;glibc是Linux下的GUN C的函数库;GNU C是一种ANSI C的扩展实现。ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。这个库可以根据头文件划分为15个部分,其中包括:<asset.h>,<ctype.h>,<errno.h>,<原创 2022-03-05 16:36:41 · 2792 阅读 · 0 评论 -
结构体定义 typedef struct LNode 用法说明
看数据结构中对链表的定义时遇到,特此记下来将typedef和结构体的定义和结构体指针的定义连在一起写,精简为如下代码:typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;将精简代码还原:struct LNode { ElemType data; struct LNode *next;};typedef struct LNode LNode;typedef struc原创 2022-02-23 22:06:28 · 1499 阅读 · 2 评论 -
~0 == -1问题全解
今天带大家复习一个容易遗忘的C语言知识点,负数的存储及其一个典型考察形式。我们先看一个题目#include<stdio.h>int main(){ int a,b,c,d; //或者 int a,b,c,d; a=0x8; b=a>>1; c=~(~0<<1); d=b&c; printf("c is %d\n",c); printf("d is %d\n",d);}解析:假设计算机是存储八位0的存储是 0b 000转载 2022-01-03 18:49:42 · 364 阅读 · 0 评论 -
连变量的储存机制都没理解怎么能算是合格的软件工程师
变量的储存机制C语言中变量名和地址的关系探讨变量名不占空间变量变量名变量名不是内存地址,其他名都是地址吗定义int a;赋值a=5;时发生了什么a=a+1执行过程汇编指令的概念a=a+1的完整执行过程最后C语言中变量名和地址的关系探讨变量名不占空间变量用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改原创 2022-01-02 22:27:04 · 600 阅读 · 0 评论 -
C语言中关于malloc(0)问题
C语言中关于malloc(0)问题malloc(0)详解常见面试题malloc(0)详解首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,就是说返回给你的指针是不能用的,感觉奇怪吧?但是从操作系统的原理来解释就不奇怪了,这要涉及操作系统维护内存的方法来说了。在内存管理中,内存被分为2部分,栈和堆,栈有自己的机器指令,是一个先进后出的数据结构,在这里不再过多解释了,malloc分配的内存是堆内存,由于堆没有自己的机器指令,所以要有系统自己编写算法来管理这片内存,原创 2021-12-25 12:11:59 · 5065 阅读 · 2 评论 -
不要自作聪明的使用递增运算符
不要自作聪明的使用递增运算符引入(a++)+(a++)+(a++)和(++a)+(++a)+(++a)C Primer Plus(第6版)中文版如何避免C语言运算符优先级表引入以下是求一个数的平方的程序,请找出错误#define SQUARE(a) ((a)*(a))int a = 5;int b;b = SQUARE(a++);宏在预编译时会以替换的形式展开,仅仅会替换。涉及到宏的地方,不要用++、- -,标准中对此没有规定,因此最终结果将会依赖于不同的编译器。执行程序的结果可能是25,也原创 2021-12-24 18:02:52 · 4097 阅读 · 0 评论 -
深入理解int *ptr=(int *)(&a+1)
目录前言正文前言碰到一道比较经典的面试题,特此记下来正文题目如下,问输出的结果是多少main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}从内存分布的角度分析&a和a做右值时的区别:如上图,&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。&a原创 2021-12-24 10:03:53 · 5480 阅读 · 3 评论 -
万物皆“指针”
万物皆“指针”前言测试总结最后前言众所周知,C/C++的知识的精髓是指针,指针的本质是内存地址,可无论是普通变量,还是类的成员变量,谁还能没有一个内存地址呢,既然普通变量有内存地址,那我们也能像对指针变量那样对普通变量进行操作,也就是指针的 * 操作和 -> 操作。测试打开compiler explorer,其网址如下:https://gcc.godbolt.org/定义一个普通的变量a,写一个func_1函数,借用指针变量p,通过 * 操作,来给变量a赋值,再写一个函数func_2,不借助原创 2021-12-23 17:42:41 · 2946 阅读 · 4 评论 -
能不能用#include“xxx.c“
请阅读:同事用#include"xxx.c"把我给惊呆了原创 2020-09-30 19:41:52 · 379 阅读 · 0 评论 -
一不小心就被“strlen“给坑了
strlen掉坑实例编码目标:根据字符串起点打印不同偏移(Offset)到结尾的字符串,如果Offset为负数就向前移动并打印到字符串末尾。掉坑示例: 1#include <stdio.h> 2#include <string.h> 3/*************************************** 4 * Fuction:sGetStr 5 * Decri :打印相应位置到末尾的字符串 7 *************************转载 2020-09-15 08:31:57 · 1065 阅读 · 0 评论 -
宏工作原理以及典型面试10问
宏工作原理以hello word程序为例来看看,将下述代码存成hello.c#include <stdio.h>#define STR "hello world"/*这是一个hello word程序*/int main(void){ printf("%s",STR); return 0;}为了说明问题,这里用下面的命令进行显式预处理,将得到hello.i文件,实际编译过程中,会自动完成。//gcc -E 生成预处理文件gcc -E hello.c -o he转载 2020-09-05 21:20:31 · 470 阅读 · 0 评论 -
C语言里面的void类型本质和NULL
C语言里面的void类型本质和NULLvoid类型本质NULLvoid类型本质编程语言类型:(1)编程语言分两种:强类型语言和弱类型语言(比如PHP…n它就是弱类型语言);强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;而弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。(2)c语言就是典型的强类型语言,c语言中所有的变量都有明确的类型;因为c语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的转载 2020-09-03 21:40:02 · 435 阅读 · 0 评论 -
(C/C++)结构体、枚举、宏、联合体、内联函数
C语言结构体对齐、枚举、宏、联合体结构体对齐问题枚举常量与宏的区别联合体和结构体区别C和C++结构体区别结构体对齐问题关于结构体对齐问题请阅读:结构体对齐规则及举例系统指定类型的大小与系统有关,这里取数据类型字节char1float4double8long double16short int2int4long int8long long int8(1)按结构体最大成员对齐(32位机下double、long long按原创 2020-08-30 15:30:47 · 528 阅读 · 0 评论 -
结构体的对齐规则及举例
结构体对齐规则及举例结构体概念结构体声明结构体对齐规则C++中的结构体struct---类结构体概念一种数据结构;C语言中聚合数据类型的一类;可以被声明为变量、数组、指针等,用以实现比较复杂的数据结构;是一系列元素的集合,这些元素被称为结构体成员;结构体成员需要用结构体名访问。结构体声明struct A{ //struct是关键字, A是结构体标志 int a; //a,b是结构体成员列表 char b;}s1; //s1是结构体变量注意事项:一般原创 2020-08-30 15:29:14 · 3206 阅读 · 0 评论 -
static、register、volatile、const、extern关键字
这里写目录标题1、static作用2、register3、volatile4、constdefine定义的宏常量和const的区别?5、extern1、static作用static修饰的静态局部变量只执行一次初始化(即再次进入时不会重新赋值),而且延长了局部变量的生命周期,直到程序运行结束以后才释放,但其作用局仍为局部。static修饰的全局变量和函数只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。无论是修饰全局还是局部,如果没有进行初始化,其默认值为0。隐藏与隔原创 2020-08-30 11:43:11 · 405 阅读 · 0 评论 -
C语言经典笔面试题(下)
C语言经典笔面试题—下1、已知一个数组table,用一个宏定义,求出数据的元素个数。2、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++ 中应用什么实现?3、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)4、以下为Linux下的32位C程序,请计算sizeof的值。5、请写出bool flag 与“零值”比较的if 语句6、请写出int 变量n 与“零值”比较的if 语句7、请写出char *p 与“零值”比较的if 语句8、以下是求一个数的平方的程序,请找出错原创 2020-08-30 10:54:49 · 774 阅读 · 0 评论 -
C语言经典笔面试题(上)
C语言经典笔面试题(上1、sizeof在什么阶段执行?它是函数还是啥?2、指针的指针3、什么是大小端?写一个简单的程序判断系统的大小端。4、用变量a定义5、位操作6、符号转换7、typedef和define的区别8、C语言程序代码优化方法9、关键字static的作用10、const的使用11、评价下面的代码片断12、写一个标准宏MIN,输入两个参数返回较小的一个13、嵌入式系统中经常要用到无限循环,你能用C编写多少种死循环呢?14、关键字volatile作用,以及常用场合。15、宏和函数的优缺点?16、re原创 2020-08-30 10:36:47 · 1247 阅读 · 0 评论 -
GetMemory()的四道经典问题
阅读此篇前可以先阅读:指针变量的传值和传址#include <stdio.h>#include <stdlib.h>void getmemory(char *p){ p=(char *) malloc(100); strcpy(p,"hello world");}int main( ){ char *str=NULL; getmemory(str); printf("%s/n",str); free(str); return 0;}运行原创 2020-08-27 20:50:42 · 738 阅读 · 0 评论 -
指针变量的传值、传址和传引用
引言举个例子:在func函数退出后,指针pInt所指的内容*pInt为 12#include <stdio.h>//公众号:C语言与CPP编程int func(int* pRes){ if(pRes == NULL) pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 return 0;}int main (){ int *pInt = NULL; int val = func(pInt); prin原创 2020-08-21 11:47:06 · 915 阅读 · 1 评论 -
函数指针,指针函数,函数指针数组
这是一个群友发的笔试题目,里面涉及的东西也比较有意思。直接看代码:void (*f[])(char *)这个是个什么东西?我们先看看下面的东西函数指针和指针函数的定义我们看个代码int *func(int a,int b)我们之前说过运算符的优先级,「 * 」 的优先级低于「( 」由于「 * 」的优先级低于「 () 」的优先级,因而func首先和后面的「 () 」结合,也就意味着,func是一个函数。即:int *(func)(int a,int b)然后这个函数的返回值的类型是转载 2020-08-20 21:50:11 · 262 阅读 · 0 评论 -
关于int *const p,const int *p和int const *p的区别
在学习c语言的过程中,可能我们很少见到int int *const p,const int *p和int const *p,但当我们在学习c++的过程中,就会遇到这些模糊不清的概概念,如果没搞清楚它们的区别,我们在使用过重中会很痛苦,但如果我们搞懂了它们之间的区别之后,用起来非常方便。首先int const * p=const int * p;都表示*p的值不能改变,而p(即地址)是可以改变的;#includeusing namespace std;int main(){int a=100;i原创 2020-08-20 20:40:28 · 1661 阅读 · 0 评论 -
函数的返回值保存在哪里
函数的返回值保存在内存的什么区域呢?1、结构体大小不超过4字节,那么仍然使用EAX寄存器传递返回值2.结构体超过4字节但不等于8字节时,调用者将首先在栈上分配一块能容纳结构体的临时内存块,然后在传递完函数参数后将该临时内存块的首地址作为隐含的第一个参数最后(因为压栈顺序是从右到左)压栈,接下的动作同前所述。当被调用函数返回时,它会通过第一个隐含参数寻址到临时内存块并将返回值拷贝到其中,然后将保存有返回值内容的临时内存块的首址存进eax寄存器中,3、结构体大小刚好为8个字节时编译器不再于栈上分配内存,而转载 2020-08-20 10:45:21 · 4512 阅读 · 0 评论 -
实参和其对应的形参各占用独立的存储单元
关于函数形参的问题?以下正确的说法是:在C语言中( )。A. 实参和其对应的形参各占用独立的存储单元B. 实参和与其对应的形参共占用一个存储单元C. 只有当实参和与其对应的形参同名时才共占用存储单元D. 形参是虚拟的,不占用存储单元答案:A这道题老是记不住,特此发个博文。实参和形参是各占独立存储空间,函数调用过程中,实参向形参拷贝复制值。实参是个变量,形参也是个变量。如果占用同一片空间的话,编译时候就不存在实参形参类型不匹配的报错。参数传递中,形参值的改变不影响实参的值。推荐阅读:指针变原创 2020-08-19 14:50:23 · 12730 阅读 · 5 评论 -
#include使用引号“”和尖括号<>的区别
很多程序员写代码,可能没有仔细研究一些细节问题,比如今天说的#include相关的内容。一、关于#include首先,#include为预处理语句,那么什么是预处理语句呢?预处理语句最明显的标志是一些行首以#开始的特殊语句。例如:#include、 #define、 #if等就是预处理语句。在程序的其它编译处理(词法分析、语法分析、代码生成、优化和连接等)之前,先进行这些语句的分析处理。在编译工具中,有一个叫预处理器,预处理器发现 #include 指令后,就会进行一些预处理操作。二、#incl原创 2020-08-15 12:58:30 · 399 阅读 · 0 评论 -
什么时候需要使用volatile关键字
想必大家平时都见过volatile关键字,可是大家知道什么时候需要使用volatile关键字吗?直接看下面代码:int a = 100;while (a == 100) { // code}这段程序编译时,如果编译器发现程序始终没有企图改变a的值,那它可能就会优化这段代码,变成while(true)的死循环使得程序执行的更快,然而这种优化有时候会变成过度优化,编译器有时候可能没有意识到程序会改变a的值,却做了这种优化导致程序没有产生预期的行为。这里为了产生预期的行为,需要阻止编译器做这种优化转载 2020-08-17 15:58:36 · 2574 阅读 · 0 评论 -
C语言入门简易笔记
C语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。想必有人会因为C语言书太厚,一时半会看不完,提不起兴趣。这里提供一个简短的学习笔记:这是我的C语言入门笔记...原创 2020-08-17 15:33:35 · 248 阅读 · 0 评论 -
我对C语言的理解—指针
我对C语言的理解—指针写在前面什么是指针变量在内存中的存储指针对象(变量)指针的声明(复杂类型说明)获取对象地址指针的四方面的内容指针的类型与指针所指向的类型指针的值指针本身所占据的内存区指针之间的赋值写在前面楼主大一开始学的C语言,后来中间也学过,一直没怎么弄懂指针,现在总算清楚点,于是结合网上资源在此记录一下我的理解。希望你看完也有一些收获。什么是指针指针是“指向(point to)”另外一种类型的复合类型。复合类型是指基于其它类型定义的类型。理解指针,先从内存说起:内存是一个很大的,线性的字原创 2020-08-17 14:45:48 · 1186 阅读 · 0 评论