
C语言
Geek_LFP
本人熟悉嵌入式软件、无线技术、C语言、Linux、ARM、STM32、ZigBee、WiFi,从事芯片软件验证工作。
展开
-
for循环与if判断的嵌套使用
for(i=0; i { if(condition) DoSomething(); else DoOtherthing(); }优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。if(conditio翻译 2017-02-20 21:59:21 · 21218 阅读 · 4 评论 -
__cplusplus的妙用
如果你不想理解下面这段代码的意义,那么请你记住:在你的代码不知道是被c调用还是c++调用时,请添加此段代码。#ifdef __cplusplusextern "C"{#endif//code#ifdef __cplusplus}#endif下面详细说明此段代码的意义: __cplusplus是c++定义的宏,如果是c++调用的话,extern c声明会有效。如果时c调用的话,那么,ex转载 2017-03-21 18:24:39 · 318 阅读 · 0 评论 -
数组作为函数参数时的用法
注意:将数组名作为参数毫无意义,因此C语言中会自动将作为参数的数组声明转换为相应的指针声明。int strlen(char s[]){ /*code*/}与下面的写法完全相同:int strlen(char* s){ /*code*/}翻译 2017-03-12 17:21:36 · 638 阅读 · 0 评论 -
空指针与空字符串
NUL是ASCII字符集中‘\0’字符的名字,它的字节模式为全0,;NULL指一个其值为0的指针。它们都是整型值,其值也相同,所以可以互换使用。注意:当常数0被转换为指针使用时,这个指针绝对不能被解引用。int *P;if(p == (char *) 0); //合法的使用if(strcmp(p,(char *)0) == 0); //非法的使用,因为函数strcmp( )查看了原创 2017-03-12 17:57:33 · 1493 阅读 · 0 评论 -
动态内存分配:如何将两个字符串连接成单个字符串
注意:字符串就是一串以NUL字节结尾的字符 mallor( )函数并不执行初始化工作char *r, *mallor();r = mallor(strlen(s) + strlen(t) + 1); //让r指向一个地址,该地址的大小动态可调整 //且必须多分配一个字节存放空字节if(!if)翻译 2017-03-12 16:55:47 · 905 阅读 · 0 评论 -
使用数组、指针的效率问题
/***数组与指针之间的关系**数组名的是一个指针常量**当你根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更改的代码,当这个增量是1并且具有地址自动增量模型时,这点表现的更为突出。**声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。**如果你可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,那时你就你需要使用一个单独的计数器。原创 2017-05-28 10:37:23 · 601 阅读 · 0 评论 -
字符串复制函数的实现
#include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 80char* strcopy(char*,char*);int main(){ char str1[SIZE]; char str2[SIZE]; printf("请输入一个字符串:"); scanf("%s",str原创 2017-05-28 10:09:05 · 720 阅读 · 0 评论 -
逻辑位运算
//正数的补码:与原码相同。//负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ int bit_1,bit_2,bit_3; bit_1 = 12; //00001100 bit_原创 2017-05-28 11:18:44 · 276 阅读 · 0 评论 -
C语言中字符数组和字符串指针分析
本文转载自:http://www.cnblogs.com/gigikouyi/archive/2006/08/01/464737.html 测试环境是win10-64位,编译器是C-free,测试程序如下: #include转载 2017-07-01 08:49:22 · 268 阅读 · 0 评论 -
C静态库的构建
本文转载自:http://blog.youkuaiyun.com/dlutbrucezhang/article/details/8755881静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后要讲到的environ变量)。本节介绍怎么创建这样一个库。我们继续转载 2017-07-08 08:45:03 · 324 阅读 · 0 评论 -
C语言中的预处理详解
本文转载自:http://blog.youkuaiyun.com/dlutbrucezhang/article/details/8753765在嵌入式系统编程中不管是内核的驱动程序还是应用程序的编写,涉及到大量的预处理与条件编译,这样做的好处主要体现在代码的移植性强以及代码的修改方便等方面。因此引入了预处理与条件编译的概念。 在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令转载 2017-07-08 11:03:39 · 396 阅读 · 0 评论 -
strlen()与sizeof()的区别
sizeof与strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。 sizeof还可以用函数做参数,比如: sh转载 2017-03-11 16:02:41 · 229 阅读 · 0 评论 -
测试各种类型所占内存的大小
注意:strlen()与sizeof()的区别 不同类型的机器,测试结果可能有所不同#include <stdio.h>#include <stdlib.h>int main(){// char *p=NULL; int *p=NULL; int a[100]; char b[1000]; int i; int m = -20; unsi原创 2017-03-11 15:30:47 · 548 阅读 · 0 评论 -
int、bool、float、指针变量与“零值”的比较
虽然效果一样的写法有多种,但最佳的风格应如下所示:int n;if(n == 0)if(n != 0)bool flag;if(flag)if(!flag)float n;const float EPSINON = 0.00001;if((n >= -EPSINON) && (n // 不可将浮点变量用“==”或“!=”与数字比较,应设法翻译 2017-02-20 23:13:03 · 327 阅读 · 0 评论 -
表达式与“零值”的比较
if(x = y) //不良的风格,有些编译器会出现警告 function(); if((x = y) != 0) //良好的风格 function();原创 2017-02-21 20:57:42 · 220 阅读 · 0 评论 -
注释的误用
y = x/*p; //这个表达式有一个隐含的错误,"/*"被编译器理解为一段注释的开始y = x / *p; //这种写法才是程序员想表达的意思原创 2017-02-21 21:19:38 · 213 阅读 · 0 评论 -
函数指针与函数返回指针的区别
int *a(),(*b) ();注意:()的优先级比*的优先级高。a是一个函数,返回值的类型为指向整型值的指针;b是一个函数指针,即函数的指针。返回值的类型为整型。原创 2017-02-22 13:17:47 · 328 阅读 · 0 评论 -
关键字typedef与#define的异同
typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别 名,而非定义一个新的数据类型,多用于修饰结构体。#define 宏常量是在预编译阶段进行简单替换。注意:应该使用typedef而不是#define来创建新的类型名,因为后者无法正确地处理指针类型。原创 2017-02-22 16:14:42 · 343 阅读 · 0 评论 -
输出缓存区的内存分配
程序输出有两种方式:一种是即时处理方式,另一种是暂存起来,然后再大块写入的方式,前者往往造成较高的系统负担。main函数结束之后,作为程序交回控制系统之前C运行时库会进行一些清理工作。缓存区的大小由系统头文件#include <stdio.h>main(){ int c; //char类型无法容纳EOF static char buf翻译 2017-03-17 21:17:33 · 633 阅读 · 0 评论 -
NULL指针
NULL指针并不指向任何对象。不同的机器对0位置的读写具有不同的权限。可以用下面的程序进行测试:#include <stdio.h>main(){ char *p; p = NULL; printf("Location 0 contains %d\n", *p);}原创 2017-03-17 21:56:33 · 234 阅读 · 0 评论 -
数组的指针表示
注意:C语言中只有一维数组。 一维数组:(a+1)是数组a中下标为1的元素的引用,以此类推,(a+i)是数组a中下标为i的元素的引用,因此它被简写为a[i]。 “二维数组”:int array[11][22];int *p;int i;p = array[2]; //使指针p指向了数组array[2]中下标为0的元素i = array[6][8]; /原创 2017-03-07 12:51:59 · 647 阅读 · 0 评论 -
指向数组的指针
问题的引出:不能将一个指向数组的指针赋值给一个指向整型变量的指针。int array[2][3];int (*ap)[3]; //声明了一个拥有3个整型元素的数组,指针指向该数组ap = array; //将数组的第一个元素的地址赋值给指针ap,即ap指向数组的第一个元素array[0]ap = &array[2]; //将数组的第三个元素的地址赋值给指原创 2017-03-07 13:13:46 · 395 阅读 · 0 评论 -
静态变量的应用
凡是在任何代码块之外声明的变量总是存储在静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。 在代码块内部声明的变量的缺省存储类型是自动的,也就是说它存储在堆栈中,称为自动变量(auto)。#include <stdio.h>#include <stdlib.h>static int j=0; //初始化之后被存在静态内存中,赋值一次改变一原创 2017-03-11 15:18:18 · 378 阅读 · 0 评论 -
C语言中 sscanf( )的用法
sscanf() - 从一个字符串中读进与指定格式相符的数据.[cpp] view plain copyprint? 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明:ssc转载 2017-07-08 15:46:17 · 608 阅读 · 0 评论