热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

推荐给你17条C语言编程小知识

1.流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空&

1. 流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率,解决发案就是尽量使用指令的“条件执行”功能。

2. 在LPC2200系列中:

可以通过过下面的程序延迟10毫秒:

for(i&#61;0;i<200;i&#43;&#43;)
{
for(j&#61;0;j<200;j&#43;&#43;);
}

3. 通过下面语句将一个16位的变量放在两个8位的变量中。

//IP数据报总长度高字节

IpHeadUint8[10]&#61;(IpHead.e_ip.Crc&0xff00)>>8;

//IP数据报总长度低字节

IpHeadUint8[11]&#61;IpHead.e_ip.Crc&0x00ff;

4. 在对全部数组元素赋初值时&#xff0c;可以不指定数组长度。

eg;inta&#61;{1,2,3,4,5};

但如果当输出第a[5]以上的元素时&#xff0c;系统回输出随机数值&#xff0c;所以使用此方法时&#xff0c;不能使用超过初始值元素以上的元素。

5. 由于ADS先天性的对printf不支持;因此不便于我们调试&#xff0c;可以利用串口输出来代替printf来调试。

6. 用或运算&#xff0c;可使某位置为1&#xff0c;其它位不变

eg: PINSEL0 |&#61; 0x00000005; //设置串口引脚

使第0位和第二位置一&#xff0c;其他位不变。

7. 函数指针

1> C语言中函数名直接对应于函数生成的指令代码在内存中的地址&#xff0c;因此函数名可以直接赋给指向函数的指针。

2> 调用函数实际上等同于“调用指令&#43;参数传递处理&#43;回归位置入栈”&#xff0c;本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器。

3> 因为函数调用的本质是跳转到某一个地址单元的code去执行&#xff0c;所以可以“调用一个根本就不存在在函数实体。

4> int (*p);定义p是一个指向函数的指针变量&#xff0c;次函数返回带回整型的返回值。*P两侧的括号不能省略&#xff0c;表示p先于*结合&#xff0c;是指针变量&#xff0c;然后再与后面的结合&#xff0c;表示此指针指向函数。

区别&#xff1a;int *p表示这个函数的返回值是指向整型变量的指针。

说明&#xff1a;

(1) 指向函数的指针变量的一般定义形式为&#xff1a;

数据类型 (*指针变量名);

1> 此处的“数据类型”是指函数返回值的类型

(2) 返回指针值的函数&#xff1a;

类型名 *函数名(参数表)

eg: int * func(int x,int y)

func是函数名&#xff0c;调用它以后能返回一个指向整型数据的指针。x,y是func的形参。

区别方法&#xff1a;

a.从右往左找第一个括号&#xff0c;括号里面的是函数的形参。

b.括号外面的第一个标识符是函数的名字&#xff0c;函数前面的表示函数的返回数值。

8. 数组指针

1>int (*p)[4]

表示*p有4个元素&#xff0c;每个元素为整型。也就是p所指的对象有4个整型元素的数组&#xff0c;既P是行指针。

2> 指针数组

Ø 一个数组&#xff0c;其元素均为指针类型数据&#xff0c;称为指针数组;即指针数组中的每一个元素都相当于一个指针变量。

Ø 一维指针数组的定义形式为&#xff1a;

类型名 *数组名[数组长度]

eg&#xff1a;int *p[4]:

作用&#xff1a;它用于指向若干个字符串&#xff0c;使字符串处理更加方便灵活。适用于一个二维字符串数组&#xff0c;其中每一行的字符数组的长度各不相同

eg:char * name&#61;{“Follow me”,”BASIC”,”GreatWall”};

9. 结构体

1> 可以用结构体变量做实参。但是用结构体变量作实参时&#xff0c;采取的是“值传递”的方式&#xff0c;将结构体变量所占的内存单元的内容全部顺序递给形参。形参也必须是同类型的结构体变量。

eg:pint(su);//注在此处su为结构体

注&#xff1a;这种传递方式在空间和时间上开销较大&#xff0c;如果结构体的规模较大时&#xff0c;开销是很可观的。

2> 用直向结构体变量(或数组)的指针作实参&#xff0c;将结构体变量(或数组)的地址传给形参

eg:print(&su);//注在此处su为结构体

10. 共用体

1> 共用体把几种不同数据类型的变量存放在同一块内存里。公用体中的变量共享同一块内存。

2> 定义公用体类型变量的一般形式为&#xff1a;

union 共用体名

{

成员列表;

}变量列表;

3>在共用体中同一块内存可以用来存放几种不同类型的数据&#xff0c;但在某一时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。

eg: union data
{
int i;
char c;
double d;
};
union data a;

共用体变量a中的成员i,c,d三个变量在内存中从同一个地址开始存储。如进行如下赋值&#xff1a;

a.i &#61; 100;

a.c &#61; ‘A’;

那么此时共用体变量a中的成员i已经没有值了&#xff0c;因为存储该值的内存现在已经被用来存储成员c的值了。

3> 共用体变量的长度取决于其成员的最大长度&#xff1a;

说明&#xff1a;

结构体变量所占内存的长度是各个成员的总和&#xff0c;每个成员分别占有自己的存储空间。共用体变量所占内存的长度是其最长成员的长度。当然&#xff0c;编译器出于提高访问效率的目的&#xff0c;在编译分配存储空间时往往要进行对齐操作。

对齐操作以最大基本类型为准。即以最大基本类型为基本单元。若按实际算下的长度不是基本单元的整数倍&#xff0c;则其实际长度应该是基本单元的整数倍。

(在TurboC中不进行对齐&#xff0c;在Linux中进行对齐)

11. CPU字长与存储器位宽不一致处理

例如&#xff1a;使用共用体来解决这一冲突&#xff1a;

union send_temp{

uint16 words;

uint8 bytes[2];

}send_buff;

eg:send_buff.bytes[0]&#61;a;//此处a 是8位

send_buff.bytes[1]&#61;b;//此处 b 是8位;

此时就将8位字拼成了16位字存储了。

发送时send(send_buff.words)就可以每次发送一个16位的数据了。

12. C语言符号优先级&#xff1a;

1>复合赋值运算符号&#xff1a;

a&#43;&#61;3*5;

等价于a&#61;a&#43;(3*5);

13.一个常见的调试策略是把一些printf函数的调用散布于程序中&#xff0c;确定错误出现的具体位置。但是&#xff0c;这些函数调用的输出结果被写入到缓冲区中&#xff0c;并不立即显示于屏幕上。事实上&#xff0c;如果程序失败&#xff0c;缓冲输去可能不会被实际写入&#xff0c;因此得到的错误位置就是错误的。解决的方法是在每个用于调试的printf函数之后立即调用fflush函数即可得到。

printf(“something or other”);
fflush(stdout);

14.关键字volatile的用法

volatile变量可能用于如下几种情况&#xff1a;

1>设备的硬件寄存器(如&#xff1a;状态寄存器)

2>一个中断服务子程序中会访问到的全局变量

3>多线程应用中被几个任务共享的变量。

15.关键字register的用法&#xff1a;

当对一个变量频繁被读写时&#xff0c;需要反复访问内存&#xff0c;从而花费大量的存取时间。为此&#xff0c;C语言提供了一种变量&#xff0c;即寄存器变量。这种变量存放在CPU的寄存器中&#xff0c;使用时&#xff0c;不需要访问内存&#xff0c;而直接从寄存器中读写&#xff0c;从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量&#xff0c;而循环计数是应用寄存器变量的最好候选者。

(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式&#xff0c;凡需要采用静态存储方式的量都不能定义为寄存器变量&#xff0c;包括&#xff1a;模块间全局变量、模块内全局变量、局部static变量;

(2) register是一个"建议"型关键字&#xff0c;意指程序建议该变量放在寄存器中&#xff0c;但最终该变量可能因为条件不满足并未成为寄存器变量&#xff0c;而是被放在了存储器中&#xff0c;但编译器中并不报错(在C&#43;&#43;语言中有另一个"建议"型关键字&#xff1a;inline)。

16.对于程序代码&#xff0c;已经被烧录在FLASH或ROM中&#xff0c;我们可以让CPU直接从其中读取代码执行&#xff0c;但通常这不是一个好办法&#xff0c;我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度。

CPU对各种存储器的访问速度&#xff0c;基本上是&#xff1a;

CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM

17. 宏定义

在C语言中&#xff0c;宏是产生内嵌代码的唯一方法。对于嵌入式系统而言&#xff0c;为了能达到性能要求&#xff0c;宏是一种很好的代替函数的方法。

1>宏定义“像”函数;

2>宏定义不是函数&#xff0c;因而需要括上所有“参数”;

3>宏定义可能产生副作用。因而不要给宏定义传入有副作用的"参数"。

END


推荐阅读
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文介绍了在Linux环境下如何有效返回命令行状态、上一级目录及快速查找头文件和函数定义的方法。包括处理长时间运行命令、编辑器退出技巧、目录导航以及文件搜索策略。 ... [详细]
author-avatar
雅白斋ab
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有