C语言
木木总裁
车载BSP
手机BSP
展开
-
&与-> 哪个优先级高
优先级 运算符 名称或含义 使用形式 结合方向 说明1 [] 数组下标 数组名[常量表达式] 左到右() 圆括号 (表达式)/函数名(形参表). 成员选择(对象) 对象.成员名-> 成员选择(指针) 对象指针->成员名2 - 负号运算符 -表达式 右到左 单目运算符(类型) 强制类型转换 (数据类型)表达式++ 自增运算符 ++变量名/变量名++ 单目运算符-- 自减运算符 --变量名/变量名-- 单目运算符* 取值运算符 *指针变量 单目运算符& 取地址运算符 &a原创 2022-01-11 17:04:07 · 4235 阅读 · 0 评论 -
定义一个函数指针类型
定义一个函数指针类型函数指针通常用来实现回调,其基本用法如下:1、定义函数指针类型// 定义一个原型为int Fun( int a );的函数指针typedef int (*PTRFUN) ( int aPara );2、函数指针变量的定义PTRFUN pFun; // pFun 为函数指针变量名int (*pFun2) ( int a ); // pFun2也是函数指针变量名3、函数指针作为函数的参数传递// 定义回调函数int CallBack( int...转载 2022-01-10 10:54:23 · 4458 阅读 · 0 评论 -
柔性数组介绍
柔性数组 柔性数组,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间),只能在堆上生成。 在结构体内,有一个数组,必须是结构体中的最后一个元素,而且有特定的形式[]或者[0],结构体中至少要有两个成员体变量。 实例: 此时的字符数...转载 2021-12-29 16:57:37 · 2619 阅读 · 0 评论 -
指针 + 1
指针 + 1指针 + 1 并不是指针代表的地址值 + 1.指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。至于真实的地址加了多少,要看原来指针指向的数据类型是什么。 char a = 'a'; char *p = &a; cout<<(void*)p<<" "<<(void*)(p+1)<<endl; //输出:0012FF33 0012FF34..转载 2020-11-17 15:03:42 · 3336 阅读 · 0 评论 -
结构体大小的计算
结构体大小的计算分类编程技术用最简单的方法,通俗易懂的方法计算结构体大小。结构体计算要遵循字节对齐原则。结构体默认的字节对齐一般满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailin.转载 2020-11-17 15:02:34 · 296 阅读 · 0 评论 -
解释下const引用形参?
所谓的const的含义, 就是该变量为"常数", 不应该也不会去修改它.void fun(const int ival){ival = 3; // 编译错误, 无法修改一个const对象.}void fun(const int& ival){ // 引用参数ival = 3; // 编译错误, 无法修改一个const对象.}也就是说, 只要对象的声明中带有const标识, 任...原创 2020-04-15 09:46:09 · 820 阅读 · 0 评论 -
回调函数的理解
回调函数的理解前言: 刚开始用C语言听说过回调函数,但没有仔细去理解,随着工作的慢慢积累,逐步的用到了回调函数,本人认为,“回调函数”的理解对于很多人是一个槛,要想跨过,就得理解清楚,还得会用。这里就用本人的方式讲解一下回调函数如何理解。第一步:通俗的解释“回调函数”一、回调就是一种利用函数指针进行函数调用的过程。二、你到一个商店买东西,刚好你要的东西没有...转载 2020-03-28 13:51:10 · 333 阅读 · 0 评论 -
数组指针和指针数组
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二...原创 2019-12-13 14:23:30 · 318 阅读 · 0 评论 -
数组的地址
&a,*a,a,a[0]——都表示的是数组第0行第0个元素的地址;*a[0]——这个特殊,表示第0行第0个元素的地址的地址;a[2],&a[2]——都表示第2行第0个元素的地址;&a[2][2]——表示第2行第2个元素的地址;详见图片,我已经把数组中主要元素的地址和值都打印出来了,数组中对应的每个元素的地址写出来了,对照的找下对应元素的位置,应该能理解&am...原创 2019-12-05 09:23:50 · 1100 阅读 · 0 评论 -
C语言extern关键字用法和理解
extern表明变量或者函数是定义在其他其他文件中的例如:extern int a;显式的说明了a的存储空间是在程序的其他地方分配的,在文件中其他位置或者其他文件中寻找a这个变量。用法一个c文件需要调用另一个c文件里的变量或者函数,而不能从.h文件中调用变量。详见下文1 extern int a = 5与int a = 5意义是一样的,都是定义。而extern int a;...转载 2019-08-14 16:09:49 · 614 阅读 · 0 评论 -
使用结构体与联合体的主要目的?
使用结构体与联合体的主要目的?使用结构体,可以把一个数据的几种属性集中起来。联合体,用来省空间。1. 区别结构体是多个不同类型变量的组合,其占用的内存大小是所有变量大小的总和联合体是多个不同类型变量的抽取,其占用内存的大小是联合体中最大的那个变量的大小2. 解释结构体中的多个变量同时存在,你可以给其中的每个变量分别赋值。任何一个变量被赋值不影响其他变量。你在需要使用时每个变量都可...原创 2019-08-14 15:22:08 · 1114 阅读 · 0 评论 -
结构体与共同体(联合体)的妙用
结构体与共同体(联合体)的妙用学习过C语言后,大家都了解了结构体与共同体。两者之间的区别是:共同体:使几个不同类型的变量共占一段内存(相互覆盖)。所占内存长度是各最长的成员占的内存长度。结构体:把不同类型的数据组合成一个整体。所占内存长度是各成员占的内存长度的总和。在C2000官方样例中,对寄存器的定义就大量使用了这两种数据结构来完成对寄存器总体或者对寄存器每一位的操作...原创 2019-08-20 11:37:31 · 3857 阅读 · 0 评论 -
C语言常见命名规则
常见命名规则骆驼(Camel)命名法近年来越来越流行,在许多新的函数库和Java这样的平台下使用得当相多。骆驼命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。例如:printEmployeePaychecks(),函数名中每一个逻辑断点都有一个大写字母来标记。帕斯卡(Pascal)命名法与骆驼命...原创 2019-08-22 14:58:00 · 4464 阅读 · 0 评论 -
C语言——enum枚举类型用法解析
C语言——enum枚举类型用法解析在实际的编程应用中,有的变量只有几种可能的取值,譬如说一个星期的七种可能,性别的两种可能等等。C语言为这种类型的变量的定义提供了enum关键字。要使用枚举类型的变量,首先需要先定义一个枚举类型名,然后再声明该变量是枚举类型的例1:enum WEEKDAY{ \\该语句定义了一个枚举类型 MONDAY = 1, TUSED...转载 2019-08-22 15:02:19 · 985 阅读 · 0 评论 -
#if defined和#if !defined(c语言的宏定义)
#if defined和#if !defined(c语言的宏定义)因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下:#define ....#define .... .... ......原创 2019-08-26 08:54:52 · 29106 阅读 · 1 评论 -
函数名前加static的一些解释
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义静态函数的好处:<1>其他文件中可以定义相同名字的函数,不会发生冲突<2>静态函数不能被其他文件所用。...原创 2019-09-05 10:49:59 · 873 阅读 · 0 评论 -
单片机编程中此句 什么意思!!
单片机编程中此句 PWME |= (1<<0)什么意思!!这句话是指将PWME寄存器的最低位(第0bit)置成1,我猜这句话可能是使能PWM0通道。(1<<x)是指将1左移x位,(1<<0)是将1左移0位即还是1,(1<<5)=0b100000=0x20另外,单片机中寄存器中给某一bit置上或清零常用下述方式:由于0|1=1 1|1=...原创 2019-09-08 17:27:48 · 765 阅读 · 2 评论 -
MCU 字节长度
在32位系统中Longint=int=32bitshortint=16bit在16位系统中shortint=int=16bitlongint=32bit原创 2019-09-25 10:27:48 · 582 阅读 · 0 评论 -
局部变量、全局变量、堆、堆栈、静态和全局的区别
重要从上图可知,程序占用的内存被分了以下几部分.1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存.2、堆区(heap)一般由程序员分配释...原创 2019-07-01 14:41:28 · 4179 阅读 · 0 评论 -
C 结构体位域
C 结构体位域位域 :有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把...原创 2019-08-14 14:48:32 · 1082 阅读 · 1 评论 -
关于联合体union的详细解释
关于联合体union的详细解释1.概述联合体union的定义方式与结构体一样,但是二者有根本区别。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。2.联合体长度在The C Programming Language里面讲述union内存分配的原话是1)联合体就是一个...原创 2019-08-14 12:01:17 · 2403 阅读 · 0 评论 -
C语言 枚举和结构体的区别
C语言 枚举和结构体的区别枚举类型:enum Position{x,y,z}static void Main(String[ ] args){Position pos = Position.x; // x为Position里的属性Console.WriteLine(pos);int num = (int) pos;//显示转换Console...转载 2019-08-14 11:36:52 · 475 阅读 · 0 评论 -
指针问题
#include <stdio.h> void main () { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&#include <stdio.h>void main (){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf ("%d,%d\n\n",*(a+...原创 2019-06-18 17:03:42 · 336 阅读 · 0 评论 -
C++ static关键字作用
C++ static关键字作用1.static修饰全局变量当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。未加static的全局变量,在符号表中是global符号,其他目标文件可见,这样的符号是要参与符号解析的。加了static之后,是local符号,其他目标文件不可见,只在当前文件中可见,不参与符号解析过程。所以多个源文件可以定义...原创 2019-06-18 16:04:14 · 11423 阅读 · 1 评论 -
形参和实参的区别
形参和实参的区别实参(argument):全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形参(parameter):全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变...转载 2019-07-01 16:43:01 · 951 阅读 · 0 评论 -
C语言中唯一的一个三目运算符(条件运算符)
C语言中唯一的一个三目运算符(条件运算符)“(a>b)?a:b”是一个条件表达式,如果(a>b)条件为真,则条件表达式去值a,否则取值b。一般形式:表达式1?表达式2:表达式3,它是C语言中唯一的一个三目运算符。执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值作为整个条件表达式的值。若表达式1的值为0,则求解表达式33,表达式3的值作为整个条件...原创 2019-06-18 14:59:51 · 11382 阅读 · 0 评论 -
进程中栈向下增长的原因
进程中栈向下增长的原因我们都知道X86系统进程中堆栈都向下增长的,那为什么是向下增长呢?“这个问题与虚拟地址空间的分配规则有关,每一个可执行C程序,从低地址到高地址依次是:text,data,bss,堆,栈,环境参数变量;其中堆和栈之间有很大的地址空间空闲着,在需要分配空间的时候,堆向上涨,栈往下涨。”这样设计可以使得堆和栈能够充分利用空闲的地址空间。如果栈向上涨的话,我们就必须得指定...原创 2019-07-01 14:34:39 · 2426 阅读 · 0 评论 -
嵌入式中的 *(volatile unsigned int *)理解
嵌入式中的 *(volatile unsigned int *)理解C语言中*(volatile unsigned int *)0x500的解释:如下;(unsigned int *)0x500:将地址0x500强制转化为int型指针*(unsigned int *)0x500=0x10:对地址为0x500赋值为0x10其中volatile关键字有以下用途:(1)用来同...原创 2019-06-17 14:16:52 · 1784 阅读 · 0 评论 -
volatile unsigned int 什么意思
volatile unsigned int 什么意思加volatile是什么意思,什么情况下加这个多是嵌入式编程时可能会用到。volatile的意思是告诉编译器,在编程源代码时,对这个变量不要使用优化。在一般的程序设计中,如:int *a; int b;b = (*a) * (*a);这种情况。通常编译器为了减少存储器的读写时间,会把代码优化为:int *a; int b...原创 2019-06-17 14:10:46 · 3234 阅读 · 0 评论 -
C函数之memcpy()函数用法
C函数之memcpy()函数用法函数原型void *memcpy(void*dest, const void *src, size_t n);功能由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。头文件#include<string.h>返回值 函数返回一个指向dest的指针。说明 1.sou...转载 2019-06-20 16:40:15 · 8044 阅读 · 0 评论 -
unsigned int和int的区别
unsigned int和int的区别void foo(void){unsigned int a = 6;int b = -20;(a+b > 6) ? puts("> 6") : puts(" <= 6");}无符号整型问题的答案是输出是">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非...原创 2019-06-18 17:28:40 · 13108 阅读 · 0 评论 -
嵌入式面试中遇到几道笔试题
嵌入式面试中遇到几道笔试题嵌入式编程方面的问题:1、找出下面程序的错误(一个中断服务子程序ISR)interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf("\nArea=%f",area);...原创 2019-06-18 17:31:47 · 1445 阅读 · 0 评论 -
在c语言中==左右两边不换位置有影响没
在c语言中==左右两边不换位置有影响没没影响,一般把定值放左边。假如你错写成一个=,定值放左边编译的时候就会报错;如果放右边,编译不会报错,但是程序已经错了,问题不容易发现...原创 2019-08-19 09:07:40 · 1291 阅读 · 1 评论 -
DB 与放大倍数 关系
n dB = 20*log(A1/A2), 这里A1/A2指代放大倍数所以A1/A2 =10^( n dB/20)原创 2019-07-22 16:11:51 · 745 阅读 · 0 评论 -
c语言中uint8_t DataBuff[60] = {0}; 是什么意思?
c语言中uint8_t DataBuff[60] = {0}; 是什么意思? 素的初始化值全为0(从名字来看用途为数据缓冲区),图二可能是一个结构之类的变量,没用过串口不太清楚。...转载 2019-07-26 11:42:17 · 5067 阅读 · 1 评论 -
Compile、Make和Build的区别
Compile、Make和Build的区别Compile、Make和Build的区别VC++6.0中Compile和Build的区别"compile"是“编译”的意思,“build”是“链接”的意思。compile的作用是对你的代码进行语法检查,将你的文本程序语言转化成计算机可以运行的“01010....”形式的二进制文件。build的作用是将你...转载 2019-07-20 08:16:00 · 4831 阅读 · 0 评论 -
C语言的“空指针”与“野指针”
空指针:在C语言里,泛型编程靠void类型来实现。即“一切皆空”,那么void类型的指针,是不是大大的提供了某些方便!在使用void*类型的指针时应该注意一下问题:(类型转换!)1 #include <stdio.h>23 int main()4 {5int a=10;6void *p=&a;...转载 2019-07-09 22:25:11 · 315 阅读 · 0 评论 -
寄存器赋值
1、赋值假如一个寄存器BIT14位要设置为1struct s3c_ts_regs {unsigned long adccon;};static volatile struct s3c_ts_regs *s3c_ts_regs;s3c_ts_regs = ioremap(0x58000000, sizeof(struct s3c_ts_regs));s3c_ts_r...原创 2019-06-28 14:38:26 · 5987 阅读 · 2 评论 -
printf("%s\n",*s);与printf("%s\n",s);的区别
printf("%s\n",*s);与printf("%s\n",s);的区别(printf("%s\n",s);)会输出字符串,但是我在运行printf("%s\n",*s)时,,理论是只会输出一个字符,但程序总是说exe报错,有人说是%s后跟的是地址,什么原因,那为啥printf("%s\n",*s)卟会输出一个字符呢? 1 2 3 4 5...原创 2019-07-02 18:54:22 · 15686 阅读 · 3 评论 -
Volatile使用原理及作用
Volatile使用原理及作用很多文章讲Volatile都讲的不是很清晰透彻,这里整理了一下,可以参考!Volatile可见性①基本概念:线程之间的可见性,一个线程修改的状态对另一个线程时可见的,也就是一个线程修改的结果,另一个线程马上就能看到。②实现原理:cpu緩存按照读取顺序与CPU结合的紧密程度,CPU缓存可分为:一级缓存:简称L1 Cache,位于CPU内核的旁边...原创 2019-06-19 14:19:41 · 241 阅读 · 0 评论