ANSI C语言标准相关知识
wangkeyen
这个作者很懒,什么都没留下…
展开
-
充电桩DWIN屏显示汉字乱码问题
问题描述:在用DWIN屏开发充电桩显示的时候,用到文本显示,用来显示“电池类型”,结果发现有的屏可以显示,有的屏不能正常显示,显示乱码,后来发现是因为字库没有放到DWIN_SET文件夹下面,后来问DWIN客服要了字库后,问题解决,另外需要注意的是,如果文本显示显示汉字,必须要有字库,并且要在FONT1_ID中写入字库所对应的号码,比如字库名为:66_GBK24_宋体HZK,则需要在FONT1_ID...原创 2018-03-12 11:36:13 · 2641 阅读 · 0 评论 -
C语言中不完全数据类型
不完全类型和复杂声明C语言的类型分为函数类型、对象类型和不完全类型三大类。对象类型又分为标量类型和非标量类型。指针类型属于标量类型,因此也可以做逻辑与、或、非运算的操作数和if、for、while的控制表达式,NULL指针表示假,非NULL指针表示真。不完全类型是暂时没有完全定义好的类型,编译器不知道这种类型该占几个字节的存储空间,例如:具有不完全类型的变量可以通过多次声明组合成一个完全类型,比如...转载 2018-02-17 16:00:48 · 1424 阅读 · 0 评论 -
链表的next指针的疑惑释怀
在学习链表的时候,常出现的定义表达形式为:typedef struct aaa{int i;struct aaa* next;}AAA;我的疑问是,为什么在结构体内,结构体aaa还没有定义好,而就在其内部使用呢?不是说先定义后使用的吗?后来经过网上查找有一种这样的解释:”这时aaa这个类型可以使用,但是个不完全类型,只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及...转载 2018-02-17 15:44:45 · 7378 阅读 · 2 评论 -
指向运算符
-> 是指向运算符,比如,P是一个对象指针,那么P所指向的内容比如:P->name,表示P所指向的对象的名字,或者表示为(*P).name,表示对象的名字,不能是P.name,因为P是一个指针,指针不能用. 。而(*P)是对象。对象可以用. 。...原创 2018-02-15 16:07:58 · 2465 阅读 · 0 评论 -
防卫式声明
不管在C还是在C++程序中,都需要包含头文件,如果一个主函数需要两个文件a.c,b.c,对应的头文件是a.h,b.h,那么在主函数中用的时候需要将a.h和b.h都包含进来,那么就可以在主函数中调用a.c,b.c/a.cpp,b.cpp中的函数,但是如果在b.h中也包含了a.h,那么在主函数中就会产生重复定义,编译器就会报错,因此在编写头文件的时候要加上防卫式声明,即#ifndef xxx#defi...原创 2018-02-15 13:07:04 · 497 阅读 · 1 评论 -
数组指针和指针数组的区别
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;转载 2018-01-26 14:09:56 · 171 阅读 · 0 评论 -
c语言回调函数理解
开源c项目当中回调函数实在是太常用了,一直不太清楚回调函数和普通函数的区别。找个机会总结下吧!C语言的核心之一就是指针,理解指针很关键。先来个有趣的东西。int *p1[10] //指针数组 int (*p1)[10] //数组指针这个应该不难理解,表达式1中p1和后面[10]结合成为数组的定义,前方的int * 表示数组的元素为指向int的指针,因此为指针数组。表达式2中转载 2018-01-26 14:02:21 · 763 阅读 · 0 评论 -
c语言中typedef的几种用法
1.常规变量类型定义例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明2.数组类型定义 例如: typedef int array[2]; 描述: array等价于 int [2]定义; array a声明等价于int a[2]声明扩展: typed转载 2018-01-25 16:50:57 · 356 阅读 · 0 评论 -
IAR调试错误 one or more breakpoints could not be set and have been disabled
原因:硬件断点太多。今天用IAR调试,设置了几个三个断点,其中有两个是硬件的断点,结果一直提示one or more breakpoints could not be set and have been disabled,不能调试。后来看到说IAR只能支持2个硬件断点,需要把现在用不到的硬件断点去掉。但是我其实只设置了两个硬件断点,于是去掉了一个,就可以调试了。IAR去掉所有断点的方法:不同的微处...转载 2018-04-10 14:13:36 · 4237 阅读 · 1 评论 -
sprintf()函数的用法
sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,...] );除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串常用方式sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:例:将”test 1...转载 2018-08-22 13:59:34 · 198876 阅读 · 4 评论 -
C语言初探——sizeof(数组名)与sizeof(*数组名)
sizeof(数组名)与sizeof(*数组名)举例#include<stdio.h>int main(){int a[5]={1,2,3,4,5};printf("sizeof数组名=%d\n",sizeof(a)); printf("sizeof *数组名=%d\n",sizeof(*a));}运行结果sizeof数组名=20sizeof *数组...转载 2019-06-22 11:11:22 · 5883 阅读 · 2 评论 -
函数能否返回函数内指针
我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能够返回其地址?静态变量与局部自动变量的主要区别是什 么? 要想明白这些就需要理解程序的内存布局情况 程序的存储区域分为:代码段、只读数据...转载 2018-11-28 20:49:19 · 1797 阅读 · 0 评论 -
枚举变量的大小是多少?
在《C语言深度剖析》这本书中留有一个问题,枚举变量的大小是多少?1、大家猜一下下面这段程序红色部分输出的结果是多少?2、在printf(char *fmt.....)函数里,如需打印枚举变量里的某个域值如何表示枚举变量里面的成员? #include <stdio.h>int main(){ enum Color { GRE...转载 2018-12-01 10:50:06 · 2740 阅读 · 0 评论 -
编程中常用的单词缩写
在编程时我们经常会用到一些缩写,下面是结合网上的和我个人总结的一些缩写,会持续更新。Aabsolute -> absaddress -> addrapplication -> appargument -> argarguments -> argsarray -> arrassemble -> asmasynchronize -> a...转载 2018-11-15 15:59:47 · 5662 阅读 · 0 评论 -
软件发布版本区别介绍-Alpha,Beta,RC,Release
Alpha:Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本alpha就是α,beta就是βalpha版就是比beta还早的测试版,一般都是内部测试的版本--------------------Beta: 很容易理解就是测试版,这个阶段的版本会一直加入新的功能。RC:RC就是Release Ca...转载 2018-10-26 13:42:14 · 3246 阅读 · 0 评论 -
float 为什么不能用== ,或者大于等于,或者小于等于
本文尝试着将以下内容做一个浅显的解释,主要包括浮点数为什么是不精确的,浮点数为什么不能用==和!=直接比较,以及浮点数的比较方法等几个方面。如果那个地方说的不对还请各位看官不吝赐教!欢迎大家评论区讨论。IEEE 754 --- 二进制浮点数算术标准浮点格式是一种数据结构,用于指定包含浮点数的字段,这些字段的布局及其算术解释。自计算机发明以来,出现了许多种不同的浮点数表达方式,目前最通用的是...转载 2018-08-19 22:15:19 · 2506 阅读 · 1 评论 -
浮点数比较大小的问题
浮点数比较大小,由于精度问题,所以直接比较有时可能会出错。 单精度数7位有效数字。 (float)双精度数16位有效数字。(double) 单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) ...转载 2018-08-19 22:11:35 · 1579 阅读 · 0 评论 -
STM32之sprintf函数
单片机中Sprint函数:说明1:使用该函数时必须包含stdio.h头文件,否则容易卡死程序说明2:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中(将数值转换成对应字符串形式,就是变换成ASCALL码),而printf函数打印输出到屏幕上。在单片机中将数值转换成字符串是sprintf函数最广的用途。Sprint函数具体形式: int sprintf...转载 2018-08-22 14:33:35 · 5847 阅读 · 0 评论 -
c/c++中函数指针的常用用法
关于C++中函数指针的使用(包含对typedef用法的讨论)(一)简单的函数指针的应用。//形式1:返回类型(*函数名)(参数表)char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); }第一行定义了一个指针变量pFun。首先我们根据转载 2018-01-25 16:35:41 · 269 阅读 · 0 评论 -
codeBlocks打开已有的文件是空白的问题。
在用codeBlocks打开DSP的main.c文件时,显示里面什么也没有,但用记事本打开就有代码。在网上搜索未果,后来问一个同事,他告诉我先用记事本打开,然后另存为,保存类型为所有文件,编码改为ANSI。我一试,果然可以了,在此多谢我的同事指点。另外把这个经验写下来,给其它朋友一个经验借鉴。原创 2017-05-18 14:12:43 · 10838 阅读 · 3 评论 -
const char*, char const*, char*const的区别
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to转载 2016-02-15 11:03:47 · 2608 阅读 · 0 评论 -
c语言的jmp_buf函数
#include#include#includestatic jmp_buf buf;main() { volatile int b; b =3; if(setjmp(buf)!=0) { printf("%d ", b); exit(0); } b=5; longjmp(buf , 1);} //请问输出是?转载 2016-02-13 14:50:48 · 7708 阅读 · 2 评论 -
va_list(),va_start() ,va_end()
(一)写一个简单的可变参数的C函数 下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的 C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr );转载 2016-02-13 11:54:37 · 349 阅读 · 0 评论 -
GetMemory函数的几种经典考法
GetMemory 改错试题4:void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ){ char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( st转载 2016-02-11 16:14:34 · 637 阅读 · 0 评论 -
char *p="%s"; printf(p);的问题
C/C++ code?123456789101112131415161718192021222324# include int main()转载 2016-02-11 15:28:31 · 1888 阅读 · 0 评论 -
printf(str) PK printf("%s", str)
在书上看见这么一段:#include int main(void){const char *p = "abcd";const char str1[5] = "abcd";char str2[5] = "abcd";printf(p);printf(str1);printf(str2);return 0;}突然就搞不懂print转载 2016-02-11 14:51:35 · 5350 阅读 · 0 评论 -
北电C语言笔试题(1)
/*写一个冒泡排序方法,bubblesort(int data[],int numbers_of_data){...} 要求如下: 1、满足数组data中的所有偶数和所有奇数均是递增排序。 2、满足data中奇、偶数分别排开,偶在前,奇在后,如: 原始data: 1 4 8 5 6 9 2 7 经过你写的函数排序后变成: 2 4 6 8 1 5 7*/v转载 2016-02-11 14:39:18 · 497 阅读 · 0 评论 -
C语言高级测试:为C程序员准备的16个最佳问题
整个测试遵循以下的约定:u 假定在所有的程序中必须的头文件都已经被正确包含。考虑如下的数据类型:u char 为1个字节u int 为4个字节u long int 为4个字节u float 为4个字节u double 为个8字节u long double 为 8个字节u转载 2016-02-11 10:19:42 · 1068 阅读 · 0 评论 -
C/C++——strcpy函数的 几种 实现 和 详细 解析
C/C++——strcpy函数的实现 和解析题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。(一)高质量c++编程上的答案五、编写strc转载 2016-02-15 11:23:00 · 677 阅读 · 0 评论 -
assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badpt转载 2016-02-15 11:39:01 · 346 阅读 · 0 评论 -
两个for循环的优缺点
1.白盒测试方法中的代码检查法需要重点考虑代码的执行效率,阅读以下两个循环,回答问题1和问题2。 循环1: for (i=0;i { if(condition) DoSomething(); else DoOtherthing(); } 循环2: if转载 2016-02-15 13:27:25 · 5297 阅读 · 0 评论 -
数组名和数组名取地址& 的区别
在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。 在以下两种场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一转载 2016-02-10 17:19:46 · 4044 阅读 · 2 评论 -
PC-Lint的使用方法
PC-Lint是一款C/C++软件代码静态分析工具,不仅可以检查一般的语法错误,还可以检查潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量、使用空指针等。在单元测试前使用PC-Lint来检查代码,可以提前发现程序中的潜在的错误,提高代码的质量。本文主要从两个方面介绍PC-lint,第一部分是在与不同的工具安装集成,第二部分是PC-lint的使用方法。1. 安装PC-lint转载 2017-01-20 09:59:13 · 5929 阅读 · 1 评论 -
一些软件设计的原则
以前本站向大家介绍过一些软件开发的原则,比如优质代码的十诫和Unix传奇(下篇)中所以说的UNIX的设计原则。相信大家从中能够从中学了解到一些设计原理方面的知识,正如我在《再谈“我是怎么招聘程序”》中所说的,一个好的程序员通常由其操作技能、知识水平,经验层力和能力四个方面组成。在这里想和大家说说设计中的一些原则,我认为这些东西属于长期经验总结出来的知识。这些原则,每一个程序员都应该了解。但是请不要转载 2016-11-10 10:20:04 · 315 阅读 · 0 评论 -
C语言循环数组做FIFO队列--一些认识
C语言循环数组做FIFO队列在做通信时,FIFO队列queue是非常好用的,先完成接收通信把接收的数据存在队列里;然后再进行先进先出逐项处理。C语言用循环数组,通过读位置和写位置循环来实现FIFO队列功能。即数组队列。1 以1个字节为单位的数组队列的数据结构使用数组队列,为了方便判断队列空和队列满,使用不完全填满队列,即保留一个元素始终不用下转载 2016-04-09 22:00:19 · 2965 阅读 · 0 评论 -
#if defined和#if !defined(c语言的宏定义)
因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下: #define .... #define .... .... .... #define a 100 ....转载 2016-03-24 14:24:07 · 36048 阅读 · 2 评论 -
排序算法入门之冒泡排序
在开发中,对一组数据进行有序地排列是经常需要做的事情,所以掌握几种甚至更多的排序算法是绝对有必要的本文章介绍的是排序算法中较简单的一种算法:冒泡排序题外话:在深入学习更多排序算法后和在实际使用情况中,冒泡排序的使用还是极少的。它适合数据规模很小的时候,而且它的效率也比较低,但是作为入门的排序算法,还是值得学习的先尝试用最简单的想法去实现排序,以此来比较学习冒转载 2016-03-22 16:41:43 · 514 阅读 · 0 评论 -
经典排序算法 - 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环)第一次两两比较6 > 2交换(内循环)转载 2016-03-22 16:18:28 · 325 阅读 · 0 评论 -
关于sizeof(str)的问题
#includemain(){char str[]="hello"char *p=str;int a,b;a=sizeof(str);b=sizeof(p);}那么a = 6b = 4因为p是一指针,32位下的所有指针都是4字节,sizeof(p)为4而不是6俗称数组退化为指针,因为sizeof是个静态操作符,编译时期就可以确定值,而固定转载 2016-02-16 10:30:57 · 5567 阅读 · 0 评论 -
Turbo C 3.0安装及使用说明
Turbo C3.0安装1.下载地址:Turbo C 3.02.安装:首先,在C盘创建文件夹TC,将压缩宝解压至其中,双击该目录下的INSTALL.exe按回车,出现如下界面键入C,出现如下界面直接按回车 之后出现如下界面按F9,出现如下界面按任意键,显示自述文件如下:至此安装转载 2016-02-10 09:14:16 · 3858 阅读 · 0 评论