![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 60
460833359
这个作者很懒,什么都没留下…
展开
-
#include “*.c“文件的妙用
今天我在看代码的时候突然看到在一个.c文件中包含了#include "*.c"代码,这个让我很诧异,然后google了一下,才发现是这么回事情,下面我写了一个测试代码,我相信你看完本篇文章就应该理解#include "*.c"文件的用法了。测试代码如下:main.c文件:print.c文件如下:这个两个代码必须放在同一目录下,但是测试时编译出错误了,大家别急,下面是我更新了的main.c文件。main.c文件:对比上面的两个main.c文件!测试编译并成功打印转载 2022-03-30 11:03:10 · 429 阅读 · 0 评论 -
带你领略glibc内存管理精髓
前言5年前,在上家公司的时候,因为进程OOM造成了上千万的损失,当时用了一个月的时间来分析glibc源码,最终将问题彻底解决。最近在逛知乎的时候,发现不少人有对malloc/free有类似的疑惑,恰好自己有阅读过这方面的源码,所以将之前的源码阅读笔记整理了下,用了大概3周的时间写了这篇文章,分析glibc的内存管理精髓,相信对c/c++从业者都会有用。提纲1 写在前面源码分析本身就很枯燥乏味,尤其是要将其写成通俗易懂的文章,更是难上加难。本文尽可能的从转载 2021-11-23 15:23:08 · 1120 阅读 · 1 评论 -
C语言中__attribute__的用法
GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。__attribute__语法格式为:__attribute__ ((attribute-lis转载 2021-11-05 14:16:35 · 1282 阅读 · 0 评论 -
#include “*.c“文件的妙用
在看uCOS II V2.91版本源代码时,在ucos_ii.c源文件中发现下面的代码: 1 #include <os_core.c> 2 #include <os_flag.c> 3 #include <os_mbox.c> 4 #include <os_mem.c> 5 #include <os_mutex.c> 6 #include <os_q.c>转载 2021-08-18 14:31:33 · 121 阅读 · 0 评论 -
What is the type of a constant in C? (U, UL, ULL, L, F)
Copied fromhere.When we write expressions like this in C:bool b = 1234567890 > 09876;What are the types of those constants? The number1234567890- what is its type? How does C represent it when compiling it? The C Programming Language says:...转载 2021-08-11 11:41:18 · 229 阅读 · 0 评论 -
手把手教你深入理解c/c++中的指针
指针是c语言为什么如此流行的一个重要原因,正是有了指针的存在,才使得c/c++能够可以比使用其他语言编写出更为紧凑和有效的程序,可以说,没有掌握指针,就没有权利说自己会用c/c++.然而。然而对于大多数初学者,面对指针这个概念简直是望而生畏,如果前期指针运用的不熟练,后期编写的程序随时都有可能成为一颗定时炸弹,因此今天我就花点时间给大家解释一下我自己对c/c++中指针的理解。一,内存和地址我们知道,计算机内存的每个字节都有一个唯一的地址,CPU每次寻址就是通过固定的步长(这就解释了为什么需要转载 2021-07-29 20:25:49 · 382 阅读 · 0 评论 -
学习心得:C语言,在形参中的引用类型,使用GCC编译不通过的两种办法
char CLinkListDelete(CircularLinkList &CL){ //删除表尾元素 if(CL->next == CL) { printf("List is EMPTY!\n"); return 0; } else { CircularLinkList p=CL->next; char e; ...转载 2021-07-16 17:26:31 · 298 阅读 · 0 评论 -
typedef与数组类型、数组指针
typedef int num[5]; //定义数组类型typedef char *num1[5]; //定义指针数组类型typedef int(*num2)[5]; //定义指向多维数组的指针类型int (*num3)[5]; //定义指向多维数组的指针变量测试程序:#include <stdio.h>#include <stdlib.h>typedef int num[5]; //定义数组类型typedef char *num1[5]; //定义...转载 2021-07-12 10:17:46 · 526 阅读 · 0 评论 -
c语言宏定义##__VA_ARGS__封装printf函数,单片机实现简单的分级日志模块
在单片机开发中经常需要加入printf之类的函数来输出调试信息,这些信息一般伴随着整个开发过程,但是在程序发布时候,又得将它们注释掉,非常的不方便,于是有了以下解决办法:使用宏定义开关#ifdef __DEBUG#define DEBUG(info) printf(info)#else#define DEBUG(info)#endif但是这样并不能发挥出printf函数的强大功能,使用起来并不方便。使用不定参数的宏定义c99规范后,编译器就开始支持不定参数##__VA_...转载 2021-06-19 09:55:53 · 732 阅读 · 0 评论 -
结构体的相互嵌套
结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针。结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针。1. 自引用结构体1.1 不使用typedef时错误的方式:struct tag_1{struct tag_1 A;int value;};这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去,无...转载 2021-06-04 11:06:38 · 814 阅读 · 0 评论 -
C语言0长度数组(可变数组/柔性数组)详解
1 零长度数组概念众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下struct Packet{ int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持};123456首先对 0长度数组, 也叫柔性数组 做一个解释 :用途 : 长度...转载 2021-05-31 15:20:17 · 694 阅读 · 0 评论 -
const
1.const与define两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内联函数(Inline)。const和define定义的常量可以放在头文件里面。(小注:可以多次声明,但只能定义一次)2.》》const与指针和引用(a)const转载 2015-09-11 23:13:06 · 281 阅读 · 0 评论 -
C中八进制和十六进制转义字符揭秘
在c中有一种数值型的转义字符,即’\ddd’的三位八进制转义字符和’\xdd’的两位十六进制转义字符。这两种转移字符其代表着一个字节大小的整数值字符。首先什么是转义字符,顾名思义转义字符最终是一种字符,只不过它是被转义了一下。所以它是一个字符的本质是不会变的。这也就是上面为什么说“这两种转移字符其代表着一个字节大小的整数值字符。”,因为字符是一个字节大小的。它是一个字符,但是由一个整数(三位八转载 2015-09-30 21:30:18 · 33131 阅读 · 1 评论 -
关于字符串指针不可修改的问题
C/C++ codechar*m ="hello"; *(m+1) ='s'; for(;*m !='\0';m++){ printf("%c\n",*m); }但是出运行时错误。----------------------------------------------------------我用数组下标的方式是可以修改的:C/C++ co转载 2015-10-02 23:26:35 · 1553 阅读 · 0 评论 -
C/C++ 数组负数下标 - 反向寻址
C++中的数组下标可以是负数。负数是可以被数组识别的,如果定义了一个数组int a[5],直接输出a[-2]的值,不同的编译器给出的是不同的值,肯定不是数组的值。可以使用指针指向数组的某个元素,然后递减,(但是要注意不应该发生越界的行为。)如下程序#include int main() { int a[ 5 ] = { 0, 1, 2, 3, 4转载 2015-10-02 11:18:11 · 2130 阅读 · 0 评论 -
C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制转载 2015-10-01 16:41:27 · 400 阅读 · 0 评论 -
当数据类型为long的变量后面没有L加会有什么后果
C/C++中long,short,int的具体区别是:占内存长度不同和取值范围不同int 32位 -2^32---2^32-1short 16位 -32768~32767 32位系统:long是4字节32位,int是4字节32位64位系统:long是8字节64位,int是4字节32位见下面两题:将本实验的实验内容1中的 long l=3615转载 2015-09-30 20:08:20 · 5813 阅读 · 0 评论 -
字节序--大端模式和小端模式
在 各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起。一、什转载 2015-09-30 19:26:24 · 797 阅读 · 0 评论 -
C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)1、cin 2、cin.get() 3、cin.getline() 4、getline() 5、gets() 6、getchar()附:cin.ignore();cin.get()//跳过一个字符,例如不转载 2015-10-01 22:50:21 · 684 阅读 · 0 评论 -
C++函数中const形参与非const形参
在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢?先来看一个简单的例子:#include #include using namespace std;void print_str(const string s){ cout<<s<<endl;}int main()转载 2015-09-11 21:50:33 · 11596 阅读 · 1 评论 -
关于i++和++i以及左值,右值
原本一直对i++和++i的区别不是很在意,觉得i++就是先用了i的值(用于赋值之类的操作),再i自加1. 而++i就是把i的值先自加1再用作其他操作. 很多人都问类似于j=++i+++i+i;之类的题目,个人觉得除了有些变态的学校的变态的考试会考.其他根本用不到.如果你在实际写代码的时候这样写,不但是给自己找麻烦,以后代码维护时,你也会被人在心里诅咒很久的....转载 2015-09-11 21:42:58 · 489 阅读 · 0 评论 -
char数组 、char指针与字符串常量的比较
数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。例:int isequiv(char *t){if (t == "char")return 1;elsereturn 0;}int main(){char test[] = "char";char *temp = "char";printf("%d"转载 2015-09-30 18:48:09 · 12494 阅读 · 2 评论 -
C/C++中的转义字符 (普通转义字符、八进制转移字符及十六进制转义字符)
从表中可以看出,在C语言中有三种转义字符,它们是:一般转义字符、八进制转义字符和十六进制转义字符。1. 一般转义字符这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符。常用的一般转义字符为:\a \n \t \v \b \r \f \\ \’ \"细心的读者可能已经发现,转义字符'\\'代表的反斜杠"\"、转义字符’\’’代表的字符"'转载 2015-09-30 21:01:25 · 16154 阅读 · 14 评论 -
赋值中的类型转换
当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:(1) 浮点型与整型 ● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。(2) 单、双精度转载 2015-10-01 20:37:33 · 2241 阅读 · 0 评论 -
C++指针加整数、两个指针相减的问题
考虑如下问题:1 char a[20];2 int *ptr = (int *)a;3 ptr++;第3句ptr++实际为ptr右移一个int空间(即4个字节)的距离,此时ptr指向a[4]。若第3句改为int *p = ptr + 2;则p指向a[8]这里说明当指针加整数时,指针向后偏移的距离看的是声明该指针的类型(此处即i转载 2015-08-26 10:36:24 · 5613 阅读 · 4 评论 -
c语言结构体可以直接赋值
结构体直接赋值的实现下面是一个实例:#include <stdio.h>struct Foo { char a; int b; double c;}foo1, foo2; //define two structs with three different fieldsvoid struct_assign(void){ ...转载 2018-12-26 16:56:29 · 4134 阅读 · 0 评论 -
C库函数-strtime()
C 标准库 – <string.h> C 库函数 – time() C 库函数 - strftime() C 标准库 - <time.h>描述C 库函数 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规...转载 2018-06-05 14:44:48 · 1171 阅读 · 0 评论 -
C库函数-localtime()
C 标准库 - <time.h>描述C 库函数 struct tm *localtime(const time_t *timer) 使用 timer 的值来填充 tm 结构。timer 的值被分解为 tm 结构,并用本地时区表示。声明下面是 localtime() 函数的声明。struct tm *localtime(const time_t *timer)参数timer -- 这是...转载 2018-06-05 14:43:39 · 1044 阅读 · 0 评论 -
Linux命令--pushd和popd
Linux有三个关于目录切换的常用命令,分别是cd,pushd,popd。cd大家再熟悉不过了,今天学习了一下pushd的使用。cd用于切换工作目录,但是如果你在两个目录之间需要频繁切换时,比如/etc/httpd/log/error和/home/testUser/Desktop/shell_test,那这样一直 cd cd会发疯的。所以pushd在此时是个好选择。pushd的 功能是创建一个...转载 2018-06-04 21:57:51 · 30236 阅读 · 1 评论 -
scanf()函数
scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。如:scanf("%d,%d", &a, &b);如果a和b都被成功读入,那么scanf的返回值就是2如果只有a被成功读入,返回值为1如果a和b都未被成功读入,返回值为0如果遇到错误或遇到end of file,返回值为EOF。且返回值为int型.scanf()函数的返回值 我转载 2015-09-25 16:29:20 · 483 阅读 · 0 评论 -
c之枚举型与switch的使用
#includeusing namespace std; int _tmain(int argc, _TCHAR* argv[]){ enum nDate {monday=1,tuesday,wednesday,thursday,friday,saturday,sunday}; char t_cNum; cin>>t_cNum; int b; b=t转载 2015-10-20 20:09:42 · 3905 阅读 · 0 评论 -
C++ rand,srand用法
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递转载 2015-10-20 23:10:13 · 287 阅读 · 0 评论 -
C++中如何修改const变量 (指针)
一、结论声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const。C++ const 修饰符,表示常量,即如果以后保证不会修改则声明为const,否则若要修改,那一开始为什么还要声明为const呢?根据C++标准,对于修改const变量,属于:未定义行为(指行为不可预测的计算机代码),这样一来此行为取决于各种编译器的具体实现转载 2015-10-05 20:04:31 · 4678 阅读 · 0 评论 -
枚举(enum)所占空间
枚举(enum)枚举的定义:enum LOG_LEVEL{ DBG, INF, WAR, ERR, FAT, ALL, OFF};void WriteInfor(LOG_LEVEL level){ switch(level){case DBG:pr转载 2015-10-03 15:36:01 · 13953 阅读 · 0 评论 -
左值与右值
左值就是那些能够出现在赋值符号左边的东西。 右值就是那些可以出现赋值符号右边的东西。 例如: a = b + 25; a就是一个左值,因为它标识了一个可以存储结果值的地点,b + 25是个右值,因为它指定了一个值。但是它们可以互换吗? b + 25 = a; 原先用作左值的a此时也可以当作右值,因为每个位置都包含一个值。然而,b + 25不转载 2015-09-11 21:36:30 · 392 阅读 · 0 评论 -
不常见的数据类型---结构体,指针,全局数据
本章主要介绍三种“不常见”的数据类型,分别是结构体,指针和全局数据,其实我觉得这三种数据类型还是很常见的,不太认同本书将之分类成“不常见”。 第一部分:结构体结构体好比是一个团体,它将一些相关的数据放在一起,比如对于student而言,属性可能包括name,age,sex,height和weight等,因此可以这样声明一个学生的结构体:struct Student{转载 2015-09-11 14:37:06 · 834 阅读 · 0 评论 -
C++中string类常用函数
C++STRING类常用函数C++string类常用函数string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的str转载 2015-08-28 22:47:52 · 821 阅读 · 0 评论 -
C++中string的size,length,capacity三者到底有何区别求解啦?
#include#includeusing namespace std;void Display(const string& str){ cout cout cout cout cout cout}int main(){ string s1; Display(s1);转载 2015-08-28 22:44:20 · 4391 阅读 · 0 评论 -
C语言中常用的库函数
1. 内存操作1) 内存设置函数原型void *memset(void *point, char value, unsigned Length)函数功能将point所指向的内存空间的前Length个字节设置为value值。参数介绍point: 指向缓存首地址value:转载 2015-08-28 15:54:20 · 361 阅读 · 0 评论 -
C语言标准库函数 qsort 详解
qsort包含在头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。函数原型:void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );用法以及转载 2015-08-28 20:32:32 · 362 阅读 · 0 评论