【原创】C语言高级用法-学习笔记.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【原创】C语言高级用法-学习笔记

#的作用 #是将其后的变量直接转换为字符串 void WriteLog(arg) { printf(%s=%d,#arg,arg) } ##的作用 ##的作用是连接两个变量 如 #define combine_converse_str(x,y) x##y int 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=12ff34 a=12ff34 *a=12ff34 ---*与消掉,*a=a=0x12ff34 a[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

您可能关注的文档

文档评论(0)

ccx55855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档