c
文章平均质量分 76
欧阳海宾
这个作者很懒,什么都没留下…
展开
-
C语言宏定义##连接符和#符的使用
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比转载 2017-07-13 10:23:14 · 460 阅读 · 0 评论 -
数组名取地址 函数名取地址
对一个函数进行 如下操作:1、函数名地址2、函数名取地址3、函数名解引用 它们的值会是怎么样的?void fun(void){ printf("GooD!\n");}int main(void){ cout cout cout return 0;}说明它们都指向了函数的首地址 按照&运算符本来的意义,它要求其操作数是一个对转载 2017-08-15 10:28:05 · 575 阅读 · 0 评论 -
函数名,函数名取地址,函数名取值之间的区别
#include typedef void (*cfp_t)(int a);cfp_t calls_table[3]={NULL,};void test(int a){ printf("test();\n");}int main(void){ printf("************0**********\n"); printf("test:%d\n原创 2017-08-15 11:30:52 · 1823 阅读 · 0 评论 -
数组a[],a,&a之间的区别代码验证
#include char test[8]={10,20,30,40,50,60,70,80};int main(void){ printf("************0**********\n"); printf("test:%d\n",test); printf("&test:%d\n",&test); printf("*test:%d\n",*test原创 2017-08-15 11:47:22 · 373 阅读 · 0 评论 -
函数指针成员是可变参函数:函数指针数组里的成员是参数各不相同的函数
api_public.h/定义函数指针数组的下标号*/enum { API_RSVD = 0, API_GETC, API_PUTC, API_TSTC, API_PUTS, API_RESET, API_GET_SYS_INFO, API_UDELAY, API_GET_TIMER, API_DEV_ENUM, API_DEV_OPEN, API_DEV_CLOSE,原创 2017-08-15 13:43:08 · 1730 阅读 · 0 评论 -
指针的大小
#include typedef struct str_test{ int a; char b; float c;}str_test;str_test* str_test_ptr;int * int_ptr;int main(void){ printf("************0**********\n"); printf("sizeof(原创 2017-08-15 13:51:02 · 458 阅读 · 0 评论 -
(void) (&_x == &_y)
#include #include #define min(x, y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })int main(void) { int x = 2; int y原创 2017-08-23 08:59:17 · 578 阅读 · 0 评论 -
c语言中typeof关键字
c语言中typeof关键字下面这两个等效声明,用于声明int类弄的变量atypeof(int) a;typeof('b') a; //相当于获取'b'的类型,定义一个变量a下面用于声明指针和数组typeof(int*) p1,p2;typeof(p1) p2 //p1与p2的类型一致int *p1,*p2;typeof(int [10]) a1,a2;转载 2017-08-23 09:21:20 · 24570 阅读 · 0 评论 -
fopen、open和popen区别
open:直接操作物理设备,比如磁盘、设备文件 一般设备/设备文件都通过open来操作 fopen:则通过缓冲区来操作(所以不能用在驱动里),读写都在缓冲区上 ,一般用来操作普通文件filepopen:会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令 依照popen参数中的type值建立管道连接到子进程的输入/输出设备中,转载 2017-08-26 11:49:44 · 3108 阅读 · 0 评论 -
宏BITS_TO_LONGS (数组位图操作) 代码测试
#include #include #include #define BITS_PER_LONG 32#define BITS_PER_BYTE 8 #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))//nr个位需要多少个long型数据变量来存储#define DI原创 2017-08-29 17:12:26 · 466 阅读 · 0 评论 -
多次包含同一个头文件,实现只写一句宏定义就可以定义出两个不同类型的变量
如何实现只写一句宏定义就可以定义出两个不同类型的变量?youli.h/*转载请注明原文地址:第一次包含这个头文件会定义宏AUD_OP_1,并定义了一个枚举类型AUDIO_MAILBOX_MSG_TYPE第二次包含这个头文件会定义宏AUD_OP_2,并定义了一个函数指针数组aud_op_function*/#ifndef _AUD_OP_DEF_H_#define _AUD_OP_D原创 2017-08-31 11:01:55 · 1225 阅读 · 0 评论 -
enum和#define共存
点1:AUD_OP_DEF.H的一些难懂点enum里面用define#undef AUD_OP_DESCR_BEG#undef AUD_OP_DESCR#undef AUD_OP_DESCR_END#defineAUD_OP_DESCR_BEG() OP_FUNC constaud_op_function[AUD_OP_MAX] = {#define AUD_OP_DE原创 2017-07-14 12:12:04 · 861 阅读 · 1 评论 -
可伸缩定义,一个16位的变量分成2段保存数据
#include #include #include /*可伸缩定义,一个16位的变量分成2段保存数据//**** Definition of macros ****/typedef unsigned short U16;typedef unsigned char U8;//定义LOW,HIGH各占几位保存#define DV_LOW_SIZE 8#define DV原创 2017-08-31 13:50:31 · 436 阅读 · 0 评论 -
c语言常用技巧
1:两个宏函数的实现#define readl(addr) (*(volatile unsigned int*)(addr))#define writel(b,addr) ((*(volatile unsigned int *) (addr)) = (b)): 2:寄存器结构体的地址转化#define S3C24X0_CLOCK_POWER_BASE 0x4C000000s原创 2017-08-09 16:03:08 · 661 阅读 · 0 评论 -
strlen和sizeof
strlen和sizeofstrlen函数所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含"\0")。sizeof 是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。原创 2017-10-10 11:08:34 · 302 阅读 · 0 评论 -
memset,memcpy,memcmp的原型函数
void * memset(void * s,int c,size_t count){ char *xs = (char *) s; while (count--) *xs++ = c; return s;}int memcmp(const void * cs,const void * ct,size_t count){ const unsigned char *su1, *s原创 2017-08-15 09:39:15 · 3253 阅读 · 0 评论 -
#if、#ifdef、#if defined之间的区别
#if的使用说明#if的后面接的是表达式#if (MAX==10)||(MAX==20) code...#endif它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)#if defined的使用#if后面接的是一个宏。#if defined (x) .转载 2017-08-07 12:06:45 · 572 阅读 · 0 评论 -
typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void)函数类型和函数指针的区别
转载请注明原地址:http://blog.csdn.net/oyhb_1992typedef int(init_fnc_t) (void)和 typedefint(*init_fnc_t) (void)函数类型和;函数指针的区别函数名概念明确: 函数名本质就是反汇编后的一个标号。这个标号就指明了函数在内存中的首地址,函数内容就是反汇编后的函数参数传给寄存器或入栈,还原创 2017-08-09 11:07:49 · 738 阅读 · 0 评论 -
define宏定义中的#,##,@#及\符号
一、#名称:字符串化操作符其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前举例:#define example1(instr) #instrstring str=example1(abc); 将会展成:string str="abc";注意:对空格的处理转载 2017-07-13 11:33:00 · 479 阅读 · 0 评论 -
sprintf函数用法详解
sprintf() 格式化输出函数(图形)功能: 函数sprintf()用来作格式化的输出。用法: 此函数调用方式为int sprintf(char *string,char *format,arg_list);说 明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用 outtextxy()函数转载 2017-07-14 09:06:41 · 194788 阅读 · 9 评论 -
__FILE__,__LINE__
前言:我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。比如,定义一个宏开关:#de转载 2017-07-21 09:33:43 · 326 阅读 · 0 评论 -
sizeof与offsetof有关的结构体详解
关于sizeof定义sizeof乃C/C++中的一个操作符(operator), 简单的说其作用就是返回一个对象或者类型所占的内存字节数。(MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate转载 2017-07-18 16:35:42 · 324 阅读 · 0 评论 -
大端小端格式详解
1. 什么是大端,什么是小端:所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。2.为什么会有大小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的cha转载 2017-08-01 15:36:56 · 201 阅读 · 0 评论 -
位域的定义和使用
位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同转载 2017-08-02 12:07:02 · 1198 阅读 · 0 评论 -
extern与头文件(*.h)的区别和联系
原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/个人认为有一些道理:所以转过来学习了。用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include(xxx.h包含了a的声明)不就可以转载 2017-08-16 16:22:23 · 988 阅读 · 1 评论 -
位域,段域,联合体,结构体操作寄存器
#include typedef int Uint16;struct SCICCR_BITS { // bit description Uint16 SCICHAR:3; // 2:0 Character length control Uint16 ADDRIDLE_MODE:1; // 3 ADDR/ID原创 2017-08-16 16:31:18 · 1408 阅读 · 0 评论 -
C语言宏定义和宏定义函数
要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。 我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义: #define MAX( a, b)转载 2017-07-25 10:19:44 · 464 阅读 · 0 评论 -
如何让地址实现某一个长度的地址对齐?
转载请注明原地址:http://blog.csdn.net/oyhb_1992/article/details/76836821如何让地址实现某一个长度的地址对其?例如将某一个地址实现4096字节对齐——————某4096字节对齐处:如3*4096,4*4096 | | | |原创 2017-08-10 11:02:55 · 2238 阅读 · 0 评论 -
va_start和va_end使用详解
转载自http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_start和va_end的使用及原理。 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表voidfoo(...);void foo(parm_list,...);这种方式和我们以前认识转载 2017-07-21 15:54:57 · 2648 阅读 · 1 评论 -
万能参数void*
/*可以把void*理解成一个泛型如C#中的object,当你传参的时候,先转化为泛型, 在用的时候你就把它转化为你想要的类型,但是也有限制:那就是只能在指针之间转化 ,不能在指针和非指针之间进行转化*/#include void Number(void* param){ //int num; //num = (int)param; //error: cast原创 2017-08-18 09:43:44 · 5289 阅读 · 0 评论 -
数组a[],a,&a之间的区别
通俗理解:内存就是公寓房间,指针就是房间的门牌号,数组就是连续的公寓房间,数组名就是这组连续房间的起始地址,也就是第一个房间的地址。例如int a[5] a是数组名,也就是第一个房间号 &a就是整个数组的门牌号,值和第一个门牌号相等,但是物理意义不一样。下面是转载自别处#includeint main(){int转载 2017-08-14 15:37:37 · 15517 阅读 · 2 评论 -
数组 门牌号 的理解
原创 2017-08-14 15:58:56 · 282 阅读 · 0 评论 -
二维数组与指针
先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char *(p)定义了一个指针P;char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型。所以char转载 2017-08-14 16:00:49 · 796 阅读 · 0 评论 -
static
关键字static的意思是静态,有3个明显作用:1)在函数体内,静态变量具有"记忆"功能。即在函数被调用过程中,一个被声明为静态变量的值维持不变。 static局部变量和普通局部变量的区别:static局部变量只被初始化一次,下一次的运算依据上一次的结果值。2)在模块内,但在函数体外,它的作用域范围是有限制的。static类型的变量,是本地的全局变量。所以,可以被模块内的所有函数访问,不可以...转载 2017-10-06 12:28:41 · 626 阅读 · 0 评论