![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
win9zz
Life is brief, and then you die, you know?
展开
-
C语言位域
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。请看下面的例子:struct bs{ unsigned m; unsign转载 2017-04-06 01:13:36 · 1199 阅读 · 0 评论 -
C语言实现字符串拷贝函数有几种方式
首先是使用库函数比如下面代码123void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //该函数还有另一个版本可以按长度截取 }还有一个函数是memcpy,这个是内存拷贝,原型是12原创 2017-04-26 00:54:33 · 12451 阅读 · 0 评论 -
C语言中将字符串转换为数字的方法
C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。以下是用atoi()函数将字符串转换为整数的一个例子:# include # include void main (void) ;void main (void){ int num; char * str = "100"; num = atoi(str);转载 2017-04-27 00:01:44 · 19657 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2017-07-28 08:45:40 · 1245 阅读 · 0 评论 -
C语言指针数组和数组指针
一、指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。下面到底哪个是数组指针,哪个是指针数原创 2017-03-29 23:36:38 · 1299 阅读 · 0 评论 -
指针常量 常量指针
指针常量(指向常量的指针):const int *pa;int const *pa;两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性。*pa =d; // 不可行(d是已经声明过的整型)但指针本身的值是可变的:pa=& d; // 可行(d是已经声明过的整型)原创 2017-08-25 11:33:31 · 1372 阅读 · 0 评论 -
sizeof计算结构体长度
sizeof在计算变量所占的空间大小时所选取的机制:1.结构体满足的三个条件结构体的大小等于结构体内最大成员大小的整数倍;结构体内的成员相对于首地址的偏移量是当前成员大小的整数倍,如有需要会在成员之间填充字节;(结构体变量的首地址能被其最大成员大小所整除。)如:struct A { char a; int b; };大小1(char)+3(原创 2017-03-08 13:14:42 · 3715 阅读 · 0 评论 -
&指针+1浅析
#include int main(){ int a[8]={'0','1','2','3','4'}; void *p=&a; void *q=(int *)&a+1; void *x=(int *)(&a+1); printf("p:%p\n",p); printf("q:%p\n",q);原创 2017-09-04 16:08:43 · 1391 阅读 · 0 评论 -
重写strcmp函数
#include #include int strcmp(const char *,const char *);int main(){ int error; char a[10]="abc"; char b[10]="abc"; error=strcmp(a,b); if(error){原创 2017-09-04 22:00:56 · 3486 阅读 · 0 评论 -
重写memcpy函数
#include #include void *memcpy(void *,const void*,size_t);int main(){ int a[10]; int b[10]={0,1,2,3,4,5,6}; int i; memcpy(a,(const void *)b,sizeof(b)); f原创 2017-09-04 21:29:07 · 2547 阅读 · 0 评论 -
C语言函数体内无条件的大括号
括号内定义的变量就只在本域(就是这个大括号)内有效,而且不会影响其他域,即使名字相同static void start_one_wire_session(unsigned char req){ ……………… { unsigned char crc; crc8_init(crc); crc8(crc, req); io原创 2017-09-20 21:56:41 · 3471 阅读 · 1 评论 -
51 C语言与汇编语言混编
1.在C中内嵌汇编语句 在#pragma asm 与#pragma endasm 中加入要内嵌的汇编语句例子: #include void main() { P0^1=1; #pragma asm 汇编延时程序 #pragma endasm P0^1=0;} 2.C程序调用汇编 (1)C转载 2017-06-28 13:45:21 · 2298 阅读 · 0 评论 -
BSS段及其他
BSS的引入C语言中包括局部变量和全局变量。局部变量存储位置在栈上(不包含静态局部变量),全局变量(和静态全局变量)存放在数据段。全局变量在内存中只有一份,局部变量(非静态)可以是多份。 BSS全称Block Started by Symbol,用来存放没有初始值或初始值为0的全局变量(静态局部变量)。BSS段没有内容,所以它在文件中也不占据空间,程序运行时初始化。 命令原创 2018-01-12 22:13:53 · 1680 阅读 · 0 评论 -
关于头文件中的 static inline函数
关于头文件中的 static inline函数头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一。于是自己验证。经过arm-none-eabi-gcc下测试后得出结论。inline 关键字实际上仅是建议内联并不强制内联,gcc中O0优化时是不内联的,即使是O2以上,如果该函数被作为函数指针赋值,那么他也不会内联,也必转载 2018-01-07 12:53:45 · 1837 阅读 · 0 评论 -
__builtin_choose_expr
type __builtin_choose_expr (const_exp, exp1, exp2)这个函数的第一个参数必须是常量表达式,因为之前我已经说过,它属于编译时行为,而非运行时行为,跟sizeof和typeof一样。这个函数是一个谓词函数,如果const_expr的结果非0,那么生成exp1,且返回类型type也与exp1表达式的类型一致;否则生成exp2,并且返回类型type也与e原创 2018-01-25 04:20:08 · 3276 阅读 · 0 评论 -
##__VA_ARGS__宏
C99规范支持了可变参数的宏,可以用VA_ARGS传递…。 用法如下:#include <stdio.h>#define DEBUG(format, ...) printf(format, __VA_ARGS__)int main(){ int turn=1; printf("enter %s\n", __func__); ...原创 2018-02-08 12:01:12 · 2734 阅读 · 0 评论 -
break continue
for (i=0;i{if (i==6) continue;/*如果i==6则不再执行下面的if语句,而是直接进行下一轮循环*/if (i==7) break;/*如果i==7,则不再执行剩余的循环,直接退出for循环去执行下面的printf();*/}printf("break");原创 2017-04-14 18:30:17 · 1230 阅读 · 0 评论 -
C语言头文件
大致格式:#ifndef __ABC_H__#define __ABC_H__//以上是为了防止头文件被多次包含,可以省略,最好有,名字任意,保证唯一即可//以下是宏定义,可有可无#define MAX 100#define MIN 0//以下是结构声明,可有可无typedef struct{ int a;}ABC;//以下是函数声明,转载 2017-04-18 21:36:28 · 1306 阅读 · 0 评论 -
C语言之volatile
补充:volatile应该解释为“直接存取原始内存地址”比较合适volatile使用地方:一般说来,volatile用在如下的几个地方:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;另外,以上这几种情况经常还要同时考虑数据的完...转载 2016-11-19 23:37:48 · 1079 阅读 · 0 评论 -
C语言符号优先级
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名原创 2016-12-03 02:21:16 · 1114 阅读 · 0 评论 -
C语言中关于float、double、long double精度及数值范围理解
IEEE754浮点数的表示方法。C语言里对float类型数据的表示范围为-3.4*10^38~+3.4*10^38。double为-1.7*10^-308~1.7*10^308,long double为-1.2*10^-4932~1.2*10^4932.类型比特(位)数有效数字数值范围float原创 2016-12-03 02:17:34 · 3102 阅读 · 0 评论 -
C语言运算中的数据类型自动转换原则
1、隐式转换 C在以下四种情况下会进行隐式转换: 1、算术运算式中,低类型能够转换为高类型。 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。原创 2016-12-03 02:03:20 · 1240 阅读 · 0 评论 -
指针作为形参
void swap1(int a,int b){ int t; t=a; //普通的形参 a=b; //不改变外部参数 b=t;}void swap2(int *a,int *b){ int t; t=*a; //用指针作为形参, *a=*b; //通过指针 *b=t; //去改变外部变量 }注意在swap2调用时应该用取地址符:swap1(a,b);swap2(&原创 2016-12-02 14:30:53 · 1313 阅读 · 0 评论 -
C语言中exit(0)与exit(1)有什么区别
exit好象在stdio.h里面,所以要有包含头文件 return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。 return是返回函数调用,如果返回的是main函数,则为退出程序 exit是在调用处强行退出程序,运行一次程序就结束 ----------------------------------------转载 2016-12-27 09:29:27 · 1405 阅读 · 0 评论 -
字符串读写函数fgets和fputs
字符串读写函数fgets和fputs 一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'/0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str转载 2017-01-18 16:29:31 · 1590 阅读 · 0 评论 -
printf()的用法
printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。函数的原型为: int printf(const char *format, ...); 函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。 printf()函数的调用格式为:转载 2017-01-18 20:43:29 · 1194 阅读 · 0 评论 -
C语言中extern的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a转载 2017-02-19 23:14:26 · 1044 阅读 · 0 评论 -
C语言指针强制类型转换
概要:C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。例如,定义如下:int a; fl转载 2017-02-20 21:56:35 · 1168 阅读 · 0 评论 -
c语言中的的内联(inline)函数
c/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸(二班的除外,二班情况下,inline函数甚至会返过来降低程序的性能)。实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量转载 2017-03-18 14:47:27 · 1312 阅读 · 0 评论 -
结构体中定义函数指针
结构体指针变量的定义,定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct结构体标识符{成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };形式2:在定义类型的同时定义变量struct结构体标识符{成员变量列转载 2017-03-06 23:34:22 · 6822 阅读 · 0 评论 -
二维数组和二级指针
对于如下程序void fun(int **data,int row,int column){ for(int i = 0;i for(int j = 0;j cout "\t"; cout endl; }}int main(){ int data[2][3] = {{3,8,4},{4,5,6}}; fun(data,2,3); return 0;}转载 2017-03-29 23:44:01 · 1783 阅读 · 0 评论 -
结构体指针数组
struct h{BTNode *TQ;int level; ?}a[100],b,*c[3],*d; a是一个结构体数组,已经有100个节点了。不需要再分配空间了。b是一个结构体变量,也已经有空间了,就和int b;已经有空间了一样。c是一个指针数组,c也已经有空间了,有3个元素,但是这三个元素是还没有分配空间的指针,所以要用malloc分别为他们分配内存。d是一个结构体原创 2017-03-26 22:05:30 · 9933 阅读 · 1 评论