C语言+编程
hanchaoman
这个作者很懒,什么都没留下…
展开
-
C语言-数组的指针
C语言二维数组转载 2022-08-19 15:03:58 · 935 阅读 · 0 评论 -
C语言的*与++的优先级关系
前缀递增递减和*优先级相同,从右到左;后缀递增递减比前缀优先级高,从左到右。比如 1 2 intarr[5]={1,3,5,7,9}; int*p=arr; *++p:p先自+,然后*p,最终为3——马上改变指针,*下一个指针*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1] ————之后改变指针,*原数据,指针++*(p++):效果等同于*p++ ——之后改变指针,*原数据,指针...原创 2022-05-20 14:44:26 · 3756 阅读 · 0 评论 -
C运算符优先级完整口诀
C运算符优先级完整口诀C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。■“单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*);■“算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);■“移”表示按位左移(<<)和位右移(>>);■“关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==转载 2022-05-20 14:33:55 · 5498 阅读 · 0 评论 -
C语言实现小数四舍五入的2种方法
方法1:编程实现C语言中实现四舍五入:(int)(a+0.5)即可。很巧妙的用了取整规则。也不用导入math.h同样注意负数的情况。把 + 换成 - 即可。float f = …..;int i = (int)(f + 0.5);i就是f四舍五入的结果。今天我要介绍在C语言中实现数据四舍五入的算法。我们知道,C语言中去除小数位采用的方法就是强制性转化成整型类型。那么假如我们要对一个小数保留三个小数位而第四个小数位按照四舍五入的规则进行,该怎样实现呢?很简单,我们将数字扩大1000原创 2022-04-26 14:51:24 · 18805 阅读 · 2 评论 -
你真的理解了const和volatile关键字么?(我看不一定)
一、总结 1、const使得变量具有只读属性(但是不一定就是不能更改) 2、const不能定义真正意义上的常量(因为有的用const定义的变量,仍然可以更改) 3、const将具有全局生命期的变量存储于只读存储区(这个是对现代编译器是这样的,但是对ANSI编译器,仍然可以更改) 4、volatile强制编译器减少优化,必须每次从内存中取值 5、const修饰的变量不是一个真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边...原创 2020-12-24 20:34:34 · 298 阅读 · 1 评论 -
arm 基础:详解C中volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;void test(){ do1(); while(flag==0); do2();} 这段程..原创 2020-12-24 20:30:26 · 534 阅读 · 1 评论 -
表驱动优化代码、加速程序执行效率(函数指针)
上一节解读了C程序中函数指针及回调函数的写法,本节再看一下函数指针另一个较为广泛的应用-驱动表程序,在这之前,首先需要了解函数指针数组的使用,依旧通过最简单最容易理解的例子来讲解。 首先看下面这个函数指针数组的使用实例。 #include <stdio.h> #include <stdlib.h> int Sum(int a, int b) { return a + b; } ...原创 2020-12-05 14:22:27 · 771 阅读 · 0 评论 -
C/C++宏的使用总结
宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为“预处理器”的模块,这个模块将宏根据编译参数和实际编码进行展开,展开后的代码才正式进入编译器,进行词法分析、语法分析等等。 我们常用的宏替换主要有这么几个类型。1.宏常量 在ACM等算法竞赛中,经常会把数组的最大下标通过宏定义的方法给出,以方便调试,例如:原创 2013-04-16 17:02:19 · 18076 阅读 · 2 评论 -
C语言中volatile关键字的作用
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的原创 2013-04-24 11:43:49 · 752 阅读 · 0 评论 -
可变参数宏编写方法
#if #ifdef #if defined 在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:#define pr_debug(fmt,arg...) /printk(KERN_DEBUG fmt,##arg)用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表,如:voi原创 2013-03-25 10:05:00 · 952 阅读 · 0 评论 -
浮点数(float)内存表示方法
月初还在上班的时候,就天天盼望着过年放长假,然而终于熬到了过年,却发现自己的12天的长假将在碌碌无为中度过,朋友们又一个接一个的远去,心里真是拔凉拔凉的啊!最近版上的人气有点低落,连违规率(不敢说犯罪率哈,怕被人砍)都下降了不少,我想在春节这档子这是免不了的,论坛上应该有不上工作的朋友可能都回家团聚了。那像我这种无家可归的人除了眼馋别人的幸福,那就只有向仍然全力支持着我们C++/面向对象这个大家庭原创 2013-01-18 16:38:40 · 5965 阅读 · 3 评论 -
阻塞与非阻塞(recv send read write 等函数介绍)
http://www.360doc.com/content/12/0107/16/1317564_177913012.shtml原创 2012-12-27 11:32:36 · 843 阅读 · 0 评论 -
C语言转义符
C语言中的转义字符在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、c、$、+和空格符等都是可显示字符。另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键(当然可以用特殊方式输入),或者当按键以后不能显示键面上的字符。其实,这类字符是为控制作用而设计的,故称为控制字符。在C语言中原创 2010-05-12 17:09:00 · 21886 阅读 · 7 评论 -
浅谈C中静态变量与全局变量初始化时间
int a;main(){while(1){ static b=1; a=2; b++; a++;}}我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看.while(1){ st原创 2012-10-26 13:43:10 · 17598 阅读 · 4 评论 -
多维数组与指针 精析
可以认为 C语言中只有一维数组,没有真正的二维数组。如二维数组 a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}} ,可以认为是一个 一维数组 : a[3]={ a[0], a[1], a[2] }其中 a[0],a[1],a[2] 又是三个有四个元素的一维数组, 即 a[0]={ 1,3,5,7 },a[1]={ 9,11,13,15原创 2012-10-26 15:41:34 · 1277 阅读 · 1 评论 -
C中的const
问题1:const变量&常量 例:为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? const int n = 5; int a[n]; 答案与分析: 1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区转载 2012-10-26 10:36:14 · 1447 阅读 · 0 评论 -
一个c回调函数的例子
01#include02// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)03 04typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 C原创 2012-09-24 16:46:48 · 13045 阅读 · 1 评论 -
详解大端模式和小端模式
一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必原创 2012-09-13 19:07:57 · 1293 阅读 · 0 评论 -
C语言const关键字作用
C语言中const代表着”不可变“,基本和常量一样不可修改,但是应用场景不一样。 一.应用在变量const char a='A';a='B'; //错误,变量a的值不可以修改。此时代表变量a值不可改变,任何企图修改a变量值的语句(例如a=20;)都会报错。 二.应用在指针 1)应用在*左边 const char *p; char const原创 2009-04-20 08:49:00 · 6815 阅读 · 2 评论 -
整型值和字符数组在内存中存储方式
void printf_buf(char *str_par,char *data_par,short len_par){ short i; printf("%s ",str_par); for(i=0;i printf("%02x ",*(data_par+i)); prin原创 2013-04-08 19:10:39 · 1497 阅读 · 0 评论 -
C语言一些常用的“位”操作函数
这些函数操作“位”,经常用到:[cpp] view plain copy print?//将双字节中某一位置位 void SetN1(unsigned short *pBuf, int n) { (*pBuf) |= 1} //将双字节中某一位清零 void SetN0(unsigned short *pBuf, int n) {转载 2016-02-18 19:12:34 · 1909 阅读 · 0 评论 -
C语言隐式类型转换
隐式类型转换分三种,即算术转换、赋值转换和输出转换。1.算术转换 进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同 一类型的数据才能运算,算术转换原则为: 整型提升:对于所有比int小的类型,包括char, signed char, unsigned char, short, unsigned short,首先会提升为int类型原创 2012-08-03 14:31:30 · 22535 阅读 · 3 评论 -
CAN总线疑惑与解答
1 CAN总线2根数据线是怎么表示数据信息1和0的?Can总线采用差分数据表示方法,平时2个数据线为2.5V,表示隐性(1)。当用数据0(显性)需要发送时1跟数据线上升到3.5V另一个下降到1.5V。如图a所示所有节点都连接到这两根数据线,当所有节点都发送数据为隐性时总线数据才表示为隐性,如果有其中一个节点发送数据显性则总线数据表示为显性。数据仲裁也就是基于这样一个特点仲裁的。原创 2014-12-01 11:29:30 · 5402 阅读 · 0 评论 -
volatile陷阱
对于volatile关键字,大部分的C语言教材都是一笔带过,并没有做太过深入的分析,所以这里简单整理了一些关于volatile的使用注意事项。实际上从语法上来看volatile和const是一样的,但是如果const用错,几乎不会有什么问题;而volatile用错,后果可能很严重。所以在volatile的使用上,建议大家还是尽量求稳,少用一些没有切实把握的技巧。注意volatile修饰转载 2014-11-14 11:32:12 · 151 阅读 · 0 评论 -
sizeof和strlen 比较经典
下面是网上的一个比较经典的例子,分析一下: char *c="abcdef";char d[]="abcdef";char e[]={'a','b','c','d','e','f'}; printf("%d%d/n",sizeof(c),strlen(c));printf("%d%d/n",sizeof(d),strlen(d));原创 2014-09-03 14:23:03 · 1087 阅读 · 0 评论 -
linux 内核链表解析2
我用一个程序来说明在struct person 中增加了struct list_head 变量后怎么来操作这样的双向链表。 [cpp] view plaincopyprint?#include #include "list.h" struct person { int age;原创 2013-12-19 17:28:50 · 786 阅读 · 0 评论 -
字节序转换宏
关键是big endian和little endian的概念。注意16bit机器和32bit机器(以32位为访问单位)下排列不同。内存地址从低地址向高地址增长,big endian是高位数据优先,即高位放在低地址。而little endian是低位数据优先,低位放在低地址。网络字节序采用大端。判断字节序:main(){ int x = 0x1;原创 2013-11-26 09:19:36 · 3201 阅读 · 0 评论 -
函数指针
函数指针的声明方法为:函数类型 (标志符指针变量名) (形参列表);注1:“函数类型”说明函数的返回类型,“(标志符指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int func(int x); /* 声明一个函数 */int (*f) (int x)原创 2013-07-12 17:20:03 · 967 阅读 · 0 评论 -
为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有堆栈指针初始化这个动作。但是,从来只是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来没有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是经过一定原创 2013-06-27 14:56:23 · 1633 阅读 · 0 评论 -
ARM汇编语言调用C函数之参数传递
之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0 传递第一个参数,R1传递到第二个..一直到R3传递第四个参数.但是实际上有时可能传递的参数非常多,超过8个,或是参数中有浮点数之类,参数也会超过 4个寄存器,对于超出的部份并不使用R4,而是使用堆栈的方式,但具体是如何的方式很多网站就没了下文了,好在在GG的帮助下,让我在凌晨1.30找到了 (为啥老是在半夜呢?)—原创 2013-06-25 14:32:25 · 5589 阅读 · 0 评论 -
ntohs和htons区别?
一直以来都对这个两个函数含含糊糊的,今天又用到所以特意查看linux的源代码(/include/netinet/in.h)# if __BYTE_ORDER == __BIG_ENDIAN/* The host byte order is the same as network byte order, so these functions are all just identity原创 2012-09-26 20:19:17 · 6022 阅读 · 0 评论 -
inline函数定义放在头文件中的作用
两个文件:main.c中得代码如下#include #include "print_inline.h"int main(int argc, char *argv[]){ print_inline();system("PAUSE"); return 0;}print_inline.h文件中得代码:#include inline原创 2012-02-17 19:25:35 · 6796 阅读 · 2 评论 -
计算机只会加法,原码,反码,补码和移码的相关概念
<br />计算机只会加法,原码,反码,补码和移码的相关概念计算机只会算加法<br />4+2 = 4+2<br />4-2 = 4+(-2)<br />2*4 = 2+2+2+2<br />8/2 = 8-2-2-2-2 = 8+(-2)+(-2)+(-2)+(-2) = 0<br /><br />数据结构中的原码 反码 补码就是因应这个加减乘除而出现的,方便CPU进行一切数学的加法运算<br />而数学上的一切大型运算,包括高等数学中的,都可以最终简化成加法,只是简化后会变成庞大的加法算式罢了.<br原创 2010-06-09 12:11:00 · 2573 阅读 · 0 评论 -
Linux C编程一站式学习
<br />learn.akae.cn/media/index.html原创 2010-06-02 12:07:00 · 1014 阅读 · 0 评论 -
自增运算符研究
现看下面的例子: 5 int i=-1,j=-1;6 int x,y;7 x=(i++)+(i++)+(i++);8 y=(++j)+(++j)+(++j);9 printf("%d,%d/n",x,y);结果为 -3,4原因:c语言对于这种运行的处理不是把i++或++j一个一个分开算的。 对于x=(i++)+(i++)+(i++); 因为是后置运算符,他是原创 2010-07-04 20:13:00 · 1636 阅读 · 0 评论 -
log --fprintf()
在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__代码:#include #define LOG_DEBUG "DEBUG"#define LOG_TRACE "TRACE"#define LOG_ERROR "ERROR"#define LOG_INFO "INFOR"#原创 2009-12-30 00:06:00 · 1891 阅读 · 0 评论 -
C语言编译全过程
C语言编译全过程 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 编译的完整过程:C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.转载 2009-11-18 18:24:00 · 822 阅读 · 0 评论 -
C优先级的口诀
学习C语言也有一段时间了,感觉C语言的运算符优先级很难记住,特别是对于初学者而言!也许你会说没有记住没关系,用括号来改变优先级就可以了。但是很多情况下,因为依赖括号很容易导致程序可读性差,当然我不是反对加括号,只是提倡恰到好处。总之,还是记住好些,读别人的程序也方便点。近来翻看了一下优先级,感觉还是有规律可循的,拿来和大家分享,希望对大家有帮助!先给出C语言的运算符优先级表:C语言原创 2009-10-22 22:10:00 · 2840 阅读 · 0 评论 -
函数调用-栈的关系
我们先不管现在EBP指向的内存(0x000f)中的内容XXX是什么(要不然会是鸡生蛋生鸡的问题),总之目前在栈中的着色块中的内容是属于函数Z的参数,Z执行结束后应该返回的地址以及Z函数的局部变量值。现在Z函数调用A函数,会先将传给A的参数压栈,然后将现在这个指令(就是"Call A"啦)的下一个指令的地址压入栈中,以便A函数完后返回到Z中继续执行。然后进入A函数的内存空间,首先就是调原创 2009-06-29 22:33:00 · 4901 阅读 · 1 评论 -
指针变量的认识、看法
1. 指针变量也只是普通的变量很多C语言的初学者都将指针变量看的很神秘,实际上,就像其他的普通变量(比如int类型的),指针变量也是一种普通变量,他具有其他变量的一切特征。例如:int main(){int q=10;int *pi=0;pi = &q;printf ("%d/n", *pi);}main中声明并定义了一个自动变量p,他的类型是pointer-to-int.一旦定义了p,编译器就要原创 2009-05-19 16:53:00 · 936 阅读 · 0 评论