- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言高级用法-学习笔记
#的作用#是将其后的变量直接转换为字符串void WriteLog(arg){ printf(%s=%d,#arg,arg)}##的作用##的作用是连接两个变量如#define combine_converse_str(x,y) x##yint Err;int Num;printf(%s,combine_converse_str(Err,Num));结果为:ErrNum再如:int a=1;int b=2;int ab=3;printf(%d,a##b);结果为: 3后面那句相当于printf(%d,ab);do{ }while(0)作用1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。3,用在宏定义上并且当宏定义需要定义成多条语句的组合时,可以保证这几条语句是一个整体的,并且可以消除使用这个宏定义后添加;所带来的报错,例如:#define aaa(x,y) \ do{ \ int a=0; \ int b=0; \函数1(x); \函数2(y); \ }while(0)调用aaa(x,y); 时不会报错并且如果使用:if (m) aaa(1,2);else aaa(3,4);时运行也不会使某些语句没有被运行到。数组名的使用数组名作为函数参数:数组名用在某个函数A的参数中时,处于函数传递效率原因,会被强制转换成了指针,此后在函数A内就完全是一个值等于对应数组首地址的指针变量,可自加自减等注意!只有在作为函数参数的情况下才会将数组名强制转换成指针,其他的都不会转换。另:数组名作为函数参数传递时,函数声明的写法有多种int aaa(char x[])int aaa(char x[1]) int aaa(char x[100])int aaa(char *x)作为函数参数时的参数声明也和普通的数组定义一样要合法,比如不能 int aaa(char x[0]),因为定义一个数组也不能用 char x[0]来定义,编译器在检查参数的声明合法后,如果发现参数是数组,就会强制转换成指针,所以int aaa(char x[1])和int aaa(char x[100])的结果是一样的。数组名用在sizeof上:结果返回的是整个数组所占空间的大小,而不是一个指针的长度数组名与和*:a与a与a[0]的值都相等,a是数组名,a是整个数组地址,a[0]是数组首元素的地址,他们都相等int a[5]={1,2,3,4,5};printf(a=%x\n,a); printf(a=%x\n,a); printf(*a=%x\n,*a);printf(a[0]=%x\n,a[0]); printf(*a[0]=%x\n,*a[0]);printf(*(a[0])=%x\n,*(a[0]));printf(*((int *)(a))=%x\n,*((int *)(a)));printf(*(*(a))=%x\n,*(*(a)));结果:a=12ff34a=12ff34*a=12ff34 ---*与消掉,*a=a=0x12ff34a[0]=12ff34*a[0]=1 ---*与消掉,*a[0]=a[0]=1 *(a[0])=1 ---*与消掉,*(a[0])=*a[0]=a[0]=1*((int *)(a))=1 ---*与之间有个强制类型转换(int *),无法直接消掉,所以按照括号次序来运算(int *)(a)=0x12ff34, *((int *)(a))=*(0x12ff34)=1*(*(a))=1 ---*与消掉,*(*(a))=*a=1指针数组:定义:基类型?*数组名[]使用:像普通的数组一样使用,数组名代表首地址,数组名[0]表示第一个元素的内容,以此类推。常见的是字符串数组,例如:char?*Names[]=????????{?????????????Bill,?????????????Sam,?????????????Jim????????};实际内存中保存的就是即首地址0x12ff0c{00x0042f2f4,0042201c},其中0址所保存的就是”Bill”,所以数组名Name=0x12ff0c, Name=0x12ff0c,*Name=0**Name=0x42printf(Name=%x\n,Name);
文档评论(0)