C的发展历程

  C原本是为了开发UNIX操作系统而设计的语言;如此说,应该C比UNIX更早问世,而事实并非如此,最早的UNIX是由汇编写的;

C语言本来是美国人开发的,解读C的声明,最好还是用英语来读;

  解读C声明的步骤:

    1、首先着眼于标识符(变量名或者函数名)

    2、从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针、数组和函数)。优先顺序说明如下:

      a、用于整理声明内容的括号;

      b、用于表示数组的[ ],用于表示函数的( )

      c、用于表示指针的*

    3、解释完成派生类型,使用 “of”、 “to”、“returning”将它们链接起来;

    4、最后,追加数据类型修饰符(在左边, int、double等)

 int  (*func_p)(double);

   1、着眼于标识符。即:func_p  /*/  func_p   is

   2、因为存在括号,着眼于括号*:  /*/func_p is  pointer  to

   3、着眼于用于整理声明内容的括号: /*/func_p  is pointer to function(参数是double)  returning

   4、最后、解释数据类型修饰符int : /*/  func_p  is pointer  to function (参数是double) returning int

  翻译成中文:func_p 是指向返回值为int 的函数的指针;

          C语言的声明不能从左往右按顺序解读;而是左右来回地解读;

基本类型和派生类型:

  int  (*func_table[10])(int  a);

  func_table  is  array(元素个数为10)   of  pointer  to function(参数int类型)   returning  int

上面的表示方法叫做“类型链的表示”

C的派生类型:

  1、结构体  2、共用体  3、指针(指向的类型不同)  4、数组  5、函数(参数不同)  

指针类型派生:

  对指针进行加法运算,指针只前进 指针所指向类型的大小的距离,这一点具有非常重要的意义;

“指向数组的指针”,

  错误理解:数组名后不加[ ] ,不就是“指向数组的指针”吗?

的确,在表达式中,数组可以被解读成指针,但是, 这不是“指向数组的指针”, 而是“指向数组初始元素的指针”

(之后就是涉及一个+1指针的跨度问题,很经典的问题)

C的声明中, [ ]比*的优先级高----------这一点很重要,在分析声明过程中;

C语言中不存在多维数组:

      int   [2][3]模型如下:

      

C语言中不存在多维数组。看上去像多维数组,其实是“数组的数组”

共用体的语法和结构体相识,但是,结构体的成员是“排列地” 分配在内存中, 而共用体的成员则是“重叠地”分配在内存中;

分析世界上最有名的程序:

  printf("hello  world \n");

  第1个参数总是传递字符串常量;

可是,在stdio.h的原型声明中, printf()的第1参数被定义为:“指向char指针”

  字符串常量的类型为“char 的数组”, 因为在表达式中,所以它也可以当成 “ 指向cahr的指针”。以此,字符串常量可以传递给printf() 是很自然的事;

变量:

  作为变量,它有作为“自身的值”使用 和 作为“自身的内存区域”使用两种情况;

表达式代表某处的内存区域的时候,我们称当前的表达式为“ 左值(lvalue)”,

相对的是,表达式只是代表值的时候,我们称当前的表达式为“右值”

  表达式中有时候存在左值,有时候不存在左值;

”左值“这个词汇的由来:

  在C以前的语言中,因为表达式在赋值的左边,所以表达式被解释成左值。“左”在英文中是left, left value 就被简写成lvalue

 但在现代C中,++var这样写法也是合法的,此时var是指某处的内存区域,但是怎么看也看不出“左边”的意思。因此,左值这个词真有点让人摸不着头脑;

  在标准委员会的定义中, lvalue的l不是left的意思,而是表示locator(指示位置的事物)。

c基础知识复习的更多相关文章

  1. spring 基础知识复习

    spring是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. 组成spring框架的每个模块(或组件)都可单独存在 ...

  2. JavaScript进阶【三】JavaScript面向对象的基础知识复习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ZYNQ笔记(0):C语言基础知识复习

    ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能.我本科学C语言时就是对付考试而已,导致现在学ZYNQ是一脸懵逼.现在特开一帖,整理一下C语言的基础知识. 一.定义 1. ...

  4. MySQL数据库基础知识复习

    现在是2020年寒假,这也是新年写的第一篇博客,用了十几天的时间自学了数据库基础部分,想总结一下得失同时并通过写博客来复习前面学的知识点. 个人: 1.本来是计划一周学完基础部分的178p但没能完成这 ...

  5. android基础知识复习——RelativeLayout布局属性、背景、半透明设置(XML设置)

    转自:http://blog.csdn.net/fansongy/article/details/6817968 复习布局与XML,写了一个空的登录界面.XML的注释我写在当行的后面了.程序运行图: ...

  6. JAVA基础知识复习小结

    集合 Set集合 Set集合的基本特征是元素不允许重复.HashSet不保存元素顺序,LinkedHashSet用链表保持元素的插入顺序,TreeSet可定制排序规则. HashSet的底层是用Has ...

  7. C++ 基础知识复习(六)

    操作系统部分: 79. 操作系统的最小调度单位:线程. 线程thread,进程process.一个进程至少包含一个线程,主线程,main thread. 80. 资源的最小单位是:进程. 81. 进程 ...

  8. C++ 基础知识复习(五)

    UML建模部分 70. 什么是UML: 答: Unified Modeling Language, 统一建模语言,是一种标准的图形化建模语言.是面向对象分析和设计的标准表示. 71. UML有哪些图: ...

  9. C++ 基础知识复习(三)

    43. 继承的几种方式: 答:共有继承public,保护继承protected,私有继承private.其中后两种继承会改变原有的访问级别. 44. 深复制与浅复制: 答:简单理解,深复制自己申请了内 ...

  10. C++ 基础知识复习(二)

    异常处理部分: 23. 在c++的异常处理中,除了提供异常的关键字语法支持以外,其标准库中支持异常处理而封装异常类也很好的为应用程序中异常处理判断使用提供直接的帮助.C++语言中针对异常处理提供了三个 ...

随机推荐

  1. postman下载和安装

    插件下载地址:http://download.csdn.net/download/zhanghaofor/8244137 下载后解压缩,里面有安装方法 1.找到后缀为crx的文件,将后缀改成rar并解 ...

  2. jquery常用选择器(转)

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  3. VS Code - Debugger for Chrome

    VS Code - Debugger for Chrome调试JavaScript的两种方式   VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于 ...

  4. ACPI引起linux系统无故重启

    新装机器无故重启多次. centos6 64bit uname -a Linux Eos 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 201 ...

  5. 解析ECC与RECC内存之间的区分

    普通的定义上区分:内存,是连接CPU 和其他设备的通道,起到缓冲和数据交换作用.当CPU在工作时,需要从硬盘等外部存储器上读取数据,但由于硬盘这个“仓库”太大,加上离CPU也很“远”,运输“原料”数据 ...

  6. 一維條碼 EAN13 的編碼方式

    何謂 EAN-13碼 ? ▲ 國家代號(3位數) 中華民國的國家代號為471. ▲ 廠商代號(6位數) 由本會核發給廠商6位數的廠商代號. ▲ 商品代號(3位數) 由廠商自行編定,按一物一號的原則,不 ...

  7. 工具类_java 操作cookie

    import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;im ...

  8. C功底挑战Java菜鸟入门概念干货(一)

    一.认识Java 1.Java 程序比较特殊,它必须先经过编译,然后再利用解释的方式来运行.  2.Byte-codes 最大的好处是——可越平台运行,可让“一次编写,处处运行”成为可能.  3.使用 ...

  9. 补丁(patch)的制作与应用

    命令简介 用到的两个命令是diff和patch. diff diff可以比较两个东西,并可同时记录下二者的区别.制作补丁时的一般用法和常见选项为: diff [选项] 源文件(夹) 目的文件(夹) - ...

  10. wordpress在window下完美实现301重定向的方法

    问题: 首先,简单说一下关于301重定向的问题,最简单的理解就是,假设你的主机上绑定有 www.uilike.cn, uilike.cn, www.uiseo.cn三个域名,当你想输入 uilike. ...