回想几个月前刚开始学C语言,听人说C语言有多难多难被吓得一愣一愣的,后来刚学会时感觉C语言易学难精,想能用只不过几天的事情,只有三十二个关键字而已。最近回头看了一下三十二个关键字,别有一翻滋味,其实我自己也没真正看懂三十二个关键字是怎么用的。

今天就挑几个关键字,及宏的用法,还有指针和数组名这个常见的新手绕口令来讲一讲C的基础之基础的细节。

先讲static,const,volatile,extern,这四个关键字。面向过程和面向对象的 static有不同的用法,前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。限于水平暂时有限,今天只说在面向过程思想编程的static用法。在面向过程中说到static,大家的第一反应是静态,他包括静态全局变量,静态局部变量和静态函数。全局静态变量 是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。静态局部变量和全局变量的区别在于作用域不一样,静态局部落变量的作用域更加小,只在于该模块。最后还有一个静态函数,它只能在声明它的文件当中可见,不能被其它文件使用。

再说关键字const,尽管const看起来真的有点像常数,但const意味着常数这句话是错得离谱的。最明显的就是用const修饰的变量做为数组的下标编译器会报错,做为菜鸟,暂时可以认为const代表只读的。const int a;

int const a;

const int *a;const  修饰整型数。

int * const a; const修饰指针。

int const * a const;整型数和指针都被const修饰。

volatile告诉编译器不可优化,哪些情况不可优化呢?常见的有并行设备的硬件寄存器(如:状态寄存器),一个中断服务子程序中会访问到的非自动变量(Non-automatic variables),多线程应用中被几个任务共享的变量。这些量可能会因为一些原因被改变,所以每次用到这些变量时都必须重读,所以优化会出错。

extern,表示变量或者函数的定义在别的文件中。看上去简单的一句话却容易让人犯糊涂。首先在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。extern只能修饰全局变量和函数,而且extern只是用来声明变量而非用来定义变量的。函数是默认在前面加个extern的,程序员加与不加都一样的效果。

总结:extern声明的符号说明了三点:符号定义在它处

符号是全局可访问符号

符号作用域开始

有关extern链接的知识点在此文中不提,已经超出C的基础语法之外.

接下来说说宏函数,讲到宏函数的知识点,一般都有这么一个例子:#define max(x,y) (x)> (y)?(x):(y); 宏做的是简单的字符替换,占用的是编译过程的预处理时间,宏的参数

不占内存时间,宏的参数即没有类型,也不会经过计算得来,没有赋值传参那么一说。

最后说到数组名和指针,无数的大大告诉我们数组名不是指针,但时仍然有无数人把他们当作一会事,因为在传参时他们

俩是通用的。那些记着数组名不是指针的菜鸟也仅仅记住了,数组名不能像指针一样被改变值。还有最直观的便是

sizeof能得出数组占用多少内存而不是指针占用多少内存。数组名作为函数参数时,对其进行sizeof又是指针占

用内存的大小。其实说白了,这些个乱七八糟的东西只是编译层面的东西,一但编译好了,哪来的数组名,机器码

层面上只有地址。我抄来一段讲得比较清楚的话:无论数组的类型是什么,数组名都保存着首元素的地址,用数组

名来引用用元素,编译器能够通过符号表保存着的数组长度信息及类型信息来直接替换成元素的地址,而把数组名

赋值给指针变量,将会失去数组长度信息,所以必须指定剩下的维数信息。所以我抛开名字定义不讲,数组名更加

多的是编译层面的语法规则问题,而指针却是实实在在占用了内存。数组名用起来如此像指针只不过正好C语言是

如此设计的,你的高级语言中右式中写到数组名,编译器在编译时会用地址给替代了而已。

C语言基础之基础的细节暂时就想到了这么多了。

c语言函数类型绕口令,编译器视角篇---C语言基础之细节相关推荐

  1. C语言 函数类型

    1. 在 [不完全类型] 一文中,描述了C中的3大数据类型,即: 函数类型.对象类型和不完全类型, 这里再次引用这张图来进行"函数类型"的讲解. 可以看到,函数类型是对立于其他的类 ...

  2. c语言函数指针 的定义方法,C语言 函数指针一(函数指针的定义)

    //函数指针 #include #include #include //函数指针类型跟数组类型非常相似 //函数名就是函数的地址,函数的指针,对函数名进行&取地址操作,还是函数名本身,这是C语 ...

  3. c语言函数输出输出型参数_c语言技巧多个输出参数

    c语言函数输出输出型参数 Over the past few years under the "new Microsoft", there have been many effor ...

  4. c语言函数声明定义参数命名,C语言函数声明与定义

    C语言函数声明与定义教程 在 C语言函数声明与定义 语法 type funcName(paramType1 param1, paramType2 param2){ // 执行语句... return ...

  5. c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享

    经济学家说过,路边是不会有100元的:但如果有,你还是要捡起来. 同理,在貌似万物免费的网络时代,你是很难找到有针对性的好资料:但是如果有,希望你能认真学习吸收. 比如笔者今天写的这一篇 一 今天这篇 ...

  6. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

  7. c语言函数输出数组,如何让C语言函数返回一个二维数组

    为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int (*resul ...

  8. c语言函数中使用指针变量,C语言函数指针变量

    C语言函数指针变量 导语:在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址. 这就是函数指针变量.下面是相关介绍,仅供参考! 在C语言中规定,一个函数总是占用一 ...

  9. c语言枚举类型enum用法参数,C语言枚举类型(Enum)

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...

最新文章

  1. 让服务器apache/iis/nginx支持.apk/ipa文件下载
  2. python 日志不会按照日期分割_python实现日志按天分割
  3. “智感超清”之HDR技术落地实践
  4. r语言dataellipse_r – 在ggplot2中微调stat_ellipse()
  5. 新技术层出不穷,一入前端深似海!
  6. Written English-书面-句型学习
  7. C/C++字符串处理库
  8. document.documentElement和document.body的区别
  9. cpu怎么超频_小白秒变高手 Intel酷睿CPU一键超频就是这么简单
  10. dagger2 注入_Android依赖注入– Dagger 2
  11. UI自动化测试篇 :Selenium2(Webdriver)TestNG自动化测试环境搭建
  12. python中的zookeeper-zkpython安装
  13. 音乐铃声解析提取API接口
  14. 用go填写pdf模板
  15. 现代软件工程讲义 5.1 软件的质量保证 (QA) 和测试 (Test)
  16. vue中的表单数据提交
  17. Android build.prop参数详解
  18. To B商业史系列 01:在线办公的潮起潮落
  19. CSDN每日一练:小桥流水人家
  20. VoIP网络电话各种软硬设备部署一览★龙人skype网络电话公司

热门文章

  1. Android 应用权限导致系统无法开机
  2. android无线充电技术,XDA大神挖出Android 11隐藏功能:反向无线充电
  3. 【DIY小记】解决技嘉Z390 AORUS PRO不识别SSD/机械硬盘的问题
  4. 杭州电子科技大学计算机科学与技术复试,2020年杭州电子科技大学计算机科学与技术考研经验分享...
  5. CMOS芯片制造全工艺流程(后端基础第一篇)
  6. 芯片设计制造和人工智能
  7. 给小白的python爬虫入门之批量爬取别样网的视频素材
  8. 保险集团CMAF想成为法国量子优势“第一个吃螃蟹的人”
  9. WinHex 19.9 (x86/x64)-SEO狼术
  10. 网站经常崩溃,企业应该如何做好监控?