历史上的今天
今天是:2024年09月14日(星期六)
2021年09月14日 | jz2440裸机开发与分析:串口编程3之printf解析
2021-09-14 来源:eefocus
测试代码:
#include void printf_test(void) { printf("hello wordn"); printf("This is www.100ask.org my_printf testn") ; printf("test char =%c,%cn", 'A','a') ; printf("test decimal number =%dn", 123456) ; printf("test decimal number =%dn", -123456) ; printf("test hex number =0x%xn", 0x55aa55aa) ; printf("test string =%sn", "www.100ask.org") ; } int main(int argc ,char *argv[]) { printf_test(); return 0; } 效果: hello word This is www.100ask.org my_printf test test char =A,a test decimal number =123456 test decimal number =-123456 test hex number =0x55aa55aa test string =www.100ask.org 下面对printf进行分析 printf函数原型 int printf(const char *format, …); format :固定参数 … :可变参数 代码如下: 方法一: #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依据:x86平台,函数调用时参数传递是使用堆栈来实现的 *目的:将所有传入的参数全部打印出来 */ int push_test(const char *format, ...) { char *p = (char *)&format; int i; struct person per; char c; double d; printf("arg1 : %sn",format); //============== p = p + sizeof(char *); /*指针对连续空间操作时: 1) 取值 2)移动指针*/ i = *((int *)p); p = p + sizeof(int); printf("arg2 : %dn",i); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ per = *((struct person *)p); p = p + sizeof(struct person); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ c = *((char *)p); p = p + ((sizeof(char) + 3) & ~3); printf("arg4: %cn",c); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ d = *((double *)p); p = p + sizeof(double); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } 方法二: #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依据:x86平台,函数调用时参数传递是使用堆栈来实现的 *目的:将所有传入的参数全部打印出来 */ int push_test(const char *format, ...) { char *p = (char *)&format; int i; struct person per; char c; double d; printf("arg1 : %sn",format); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ p = p + sizeof(char *); i = *((int *)p); printf("arg2 : %dn",i); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ p = p + sizeof(int); per = *((struct person *)p); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ p = p + sizeof(struct person); c = *((char *)p); printf("arg4: %cn",c); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ p = p + ((sizeof(char) + 3) & ~3); d = *((double *)p); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } 方法三:调用库文件(stdarg.h) 代码如下: #include #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依据:x86平台,函数调用时参数传递是使用堆栈来实现的 *目的:将所有传入的参数全部打印出来 */ int push_test(const char *format, ...) { //char *p = (char *)&format; int i; struct person per; char c; double d; va_list p; printf("arg1 : %sn",format); //============== //p = p + sizeof(char *); va_start(p, format ); /*指针对连续空间操作时: 1) 取值 2)移动指针*/ //i = *((int *)p); //p = p + sizeof(int); i = va_arg(p,int); printf("arg2 : %dn",i); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ //per = *((struct person *)p); //p = p + sizeof(struct person); per = va_arg(p,struct person); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ //c = *((char *)p); //p = p + ((sizeof(char) + 3) & ~3); c = va_arg(p,int); printf("arg4: %cn",c); //============== /*指针对连续空间操作时: 1) 取值 2)移动指针*/ //d = *((double *)p); //p = p + sizeof(double); d = va_arg(p,double); /*避免"野指针"*/ //p = (char *)0; va_end( p ); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } stdarg.h中 typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //#define va_arg(ap,t) (ap = ap + _INTSIZEOF(t), *(t *)(ap - _INTSIZEOF(t))) #define va_arg(ap,t) (*(t *)(ap = ap + _INTSIZEOF(t), ap - _INTSIZEOF(t))) #define va_end(ap) ( ap = (va_list)0 )
史海拾趣
|
C8051F+OLED+SHT21设计原理图(第二稿),欢迎大家提出宝贵意见 花了几天时间,总算把本次设计的原理图初稿完成了一下,希望关注的朋友们提点意见以助修改。 目前情况是这样的,本设计,我和空灵准备做一个更趋向于产品的小东西,所以可以做得小巧细致。目前方案如下: 1,锂电池组供电,USB通讯供电(目前锂电 ...… 查看全部问答> |
|
static struct file_operations qq2440_leds_fops = { .owner = THIS_MODULE, .ioctl = &nb ...… 查看全部问答> |
|
华为3G模块问题,USTS 00 00 01 c0 canceled ,USTS 04 00 01 c0 stall pid 问题描述 : 使用华为的WCDMA 3G模块,自己做一个拨号软件,发现连接和断开有问题,有时候连了很久连不上去,有时候连上了断不开,开始时怀疑我的程序有问题,后面再windows下控制面板->网络连接里面 新建一个连接,然后一直连接, ...… 查看全部问答> |
|
请教S3C2440中的Uart串口地址问题:UART0的发送缓冲区地址为0X50000020,接收缓冲区地址为0X50000024,中间只相差4个字节,怎么来的64字节的FIFO缓冲区呢? 谢谢!… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 中国互联网巨头盛大推出的电子书内测价格让整个电子阅读器产业感到了前所未有的“寒意”,而友达大规模进军电子书屏幕市场使得电子书屏幕一直被一家企业垄断的格局即将被打破,加上其他企业也 ...… 查看全部问答> |
|
小弟最近在做dsp5509向sd卡写入速度的测试实验,可是实验结果相当的不理想,要么是写的数据不完整,要么是写入速度太慢了,用的芯片是5509.有没有哪位大侠做过相关这方面的测试,能和小弟交流下么qq:106703178email:lovejy984@163.com不胜感激啊 ...… 查看全部问答> |
|
指纹锁作为门禁识别的衍生产品,依赖于生物识别的技术发展,国外已经逐步兴起进入更多的家庭当中。对于我们国内市场而言,指纹锁的普及率远不及它的名声那样红火。然而对于安防市场,指纹锁仍有可爆发的市场潜力,随着科技的不断进步,高端指纹 ...… 查看全部问答> |




