
C语言积累
LudyYuen
孤苦伶仃学Java~
展开
-
C语言中,头文件和源文件的关系
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用转载 2015-01-11 18:14:29 · 512 阅读 · 0 评论 -
编写独立功能模块时,随时注意退出时释放资源
参考项目中的adidemo后,我发现模块的打开,关闭涉及到资源的释放问题比较严重,比如线程退出时的资源,分配的动态内存的释放等等。退出一个独立的功能模块时,一定要将这些资源释放干净,并且以后在编写其他的功能模块时,写功能的同时就应该把释放资源的函数写好,避免功能模块完成时还需要重新考虑资源释放顺序和哪些资源需要释放的问题。原创 2016-03-29 14:03:44 · 406 阅读 · 0 评论 -
快速为所有数组元素赋相同的值以及在switch中的应用
1. 快速复制int a[10] = {0}; // 把所有元素赋值为0int b[10] = {[0 ... 9] = 1}; // 把所有元素赋值为12. 在switch中的应用for(j = 0; j switch(j){case 0 ... 5:printf("0 ... 5\n");break;case 6 ... 9:printf("原创 2016-05-16 16:47:48 · 1174 阅读 · 0 评论 -
C语言中的位移运算
C语言中的位移运算效率比乘除法高,所以尽量用位移运算替代乘除法。1、什么样的数据类型可以直接移位char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。2、有符号数据类型的移位操作原创 2016-05-23 09:18:02 · 1072 阅读 · 0 评论 -
头文件相互包含引起的编译问题
http://blog.youkuaiyun.com/hazir/article/details/38600419#comments 个人觉得帖子中的处理方法肯定不是最佳的方法,头文件中的数据结构相互包含的情况本身就是不符合规范的,即使是使用LZ提到的解决方法,也只是表面上解决了,实际上是把问题屏蔽了而已。正确的解决方向应该是合理规划和设计头文件的数据结构以及头文件的包含关系,做到头转载 2016-07-07 15:48:33 · 717 阅读 · 2 评论 -
ISO8583位图判断相关
对于一个位图中的一个字节A,最小位图对应位置为B,最大位图对应位置为C,如果A的二进制位图处于B和C之间那么:(A&B)^B应该为0;(A|C)^C应该为0;通过循环判断位图中所有的位图字节,即可判断此二进制位图是否位于最大位图和最小位图之间。原创 2016-11-22 17:34:21 · 1032 阅读 · 0 评论 -
strcpy, strncpy, strcat, strncat, sprintf, snprintf等常用函数
strcpy:函数原型:char *strcpy(char* dest, const char *src);使用建议:非常不安全的函数,第二个参数src遇到'\0'才会停止复制,dest太小就可能会内存操作越界;strncpy:函数原型:char *strncpy(char *dest,char *src,size_t n);使用建议:较安全的函数,正好向des原创 2016-11-21 17:25:23 · 2196 阅读 · 0 评论 -
printf格式化输出
①d格式:用来输出十进制整数。有以下几种用法:%d:按整型数据的实际长度输出。%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。%0md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以0,若大于m,则按实际位数输出。(%0md不是右补零,还是右补空格)。⑥s格式:用来输出一个串。无法像%d那样左补零。%s:例原创 2016-11-22 14:57:31 · 410 阅读 · 0 评论 -
关于函数实参传递结构体变量的思考
main.c测试代码如下:#include struct aaa{ char b[10]; int t; float q;};struct aaa tt = {"aaaaaaaaa", 2, 2.2};void fun(struct aaa c){ printf("+++++0x原创 2017-03-04 17:13:11 · 1072 阅读 · 0 评论 -
字符数组什么时候可以看做是一个字符串?
C语言中字符串定义:字符串是由数字、字母、下划线等组成的一串字符,并以'\0'结尾。char dog[8] = {'b', 'e', 'a', 'u', 'x', ' ', 'i' 'i'};// not a stringchar cat[8] = {'f', 'a', 't', 'e', 's', 's', 'a', '\0'};// a string原创 2017-03-04 17:48:26 · 699 阅读 · 0 评论 -
关于char *p = "";的思考
偶然记起在浏览别人的代码的时候发现有一处指针的初始化时这样写的:char *p = "";首先我们知道char *p = NULL;的意思是将p初始化为NULL(和'\0', 0)的意思一样,防止使用野指针p。不过char *p = "";又是什么意思呢?main.c测试如下:char *p = ""; printf("+++++++0x%08x\n", p);原创 2017-03-04 17:00:21 · 1085 阅读 · 0 评论 -
关于C语言中switch的case里定义变量解决编译报错
时间紧促,粗糙记录一下!一:case 1:int a;break;case 2:......二:case 1:char *p = malloc(......);.......case 2:......像一那样在case里面直接定义变量时,编译器一般是会报错的,应该改为如下,以表示是在{}的范围内有效的变量case 1:{int原创 2017-03-17 22:31:17 · 2232 阅读 · 0 评论 -
C语言位域精解
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位转载 2015-08-02 13:10:41 · 399 阅读 · 0 评论 -
stack的三种含义
学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。含义一:数据结构stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。在这种数据结构中,数据像积木那样一层层堆起来,后面加入转载 2015-08-02 16:20:28 · 529 阅读 · 0 评论 -
C语言内存区域分配
阅读Unix环境高级编程的时候,读到了程序存储空间分配,借鉴了网上的一些资料总结如下: 一、C语言可执行代码结构 名称存储内容代码段可执行代码、字符串常量 、只读的常数变量数据段已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据BSS段未初始化全局变量,未初始化全局静态变量 栈转载 2015-03-20 15:33:09 · 488 阅读 · 0 评论 -
sscanf和sprintf高级应用
sscanf sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( const char *, const char *, ...); int sscanf(const char *buffer,const char *format,[argument ]...);转载 2015-03-20 15:39:58 · 643 阅读 · 0 评论 -
C语言中的static
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)第一个作用:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容#include增加这条语句char a = ‘A‘; // global variablevo转载 2015-04-03 17:40:13 · 448 阅读 · 0 评论 -
函数返回请注意
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意转载 2015-04-07 13:36:44 · 407 阅读 · 0 评论 -
strlen()和sizeof()计算字符串长度
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项。C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度。在程序里,一般会用strlen()函数或sizeof来获取一个字符串的长度,但这2种方法获取的字符串的长度其实是不一样,我们用如下函数进行测试:[cpp] view plaincopy转载 2015-02-06 17:11:35 · 7945 阅读 · 0 评论 -
c语言里的可变参数宏及##
有时我们写程序可能会定义许多DEBUG模式下的调试打印信息宏来替代原有的打印函数,这时就会出现编写可变量参数宏的写法问题,下面就摘要性的写一下,运行及调试环境为rh linux 9.0+gcc 3.2.2首先在gcc中,对可变量参数宏的支持要强的多,一般我们可以这么写:#define MACRO_1(fmt, args...) printf(fmt, args)#defin转载 2015-03-02 14:40:26 · 607 阅读 · 1 评论 -
数组名是不是指针?
引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误转载 2015-04-09 20:08:02 · 10545 阅读 · 16 评论 -
C语言条件编译及编译预处理阶段
一、C语言由源代码生成的各阶段如下:C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制转载 2015-03-20 14:39:42 · 458 阅读 · 0 评论 -
软件项目工程中的调试技巧
#define FUN_DEBUG 0#define ARG_DEBUG 0#define ERR_DEBUG 0#if FUN_DEBUG #define FUN_IN(fmt, args...) printf("====>%s()"fmt"\n", __func__, ##args) #define FUN_OUT(fmt args...) p原创 2015-02-28 17:07:36 · 900 阅读 · 0 评论 -
extern数组与extern指针
数组名代表了存放该数组的那块内存,它是这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量一样,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址。这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,它转载 2015-04-28 20:18:15 · 430 阅读 · 0 评论 -
代码的抽象三原则
软件开发是"抽象化"原则(Abstraction)的一种体现。所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。开发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量。要做到这两个目标,这需要"抽象化"。最近,我读到美国程序员Derick Bailey的一篇文章,谈到"转载 2015-08-02 14:36:45 · 409 阅读 · 0 评论 -
关于C语言中switch的第一个case上面写代码的愚蠢之举
今天在开发贷记卡ATM前置时,在ATMCommCCPS.c中写下了如下代码switch (atoi(cvtXml[i].txn_num)){ ret = -1; HtLog(gsLogFile,HT_LOG_MODE_DEBUG,__FILE__,__LINE__, "1atoi(cvtXml[i].txn_num = %d", atoi(cvtXml[原创 2017-03-16 16:21:24 · 3172 阅读 · 0 评论