博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c基础知识复习
阅读量:6501 次
发布时间:2019-06-24

本文共 1775 字,大约阅读时间需要 5 分钟。

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(指示位置的事物)。

 

转载地址:http://xuvyo.baihongyu.com/

你可能感兴趣的文章
android实现图片识别的几种方法
查看>>
mvc学习地址
查看>>
masonry 基本用法
查看>>
使用openssl创建自签名证书及部署到IIS教程
查看>>
Word产品需求文档,已经过时了【转】
查看>>
dtoj#4299. 图(graph)
查看>>
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
Visual Studio Remote Debugger(for 2005/2008) .net远程调试<转>
查看>>
怎么获得combobox的valueField值
查看>>
浅谈C/C++中的static和extern关键字
查看>>
Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
查看>>
浅谈网络协议(四) IP的由来--DHCP与PXE
查看>>
jre与jdk的区别
查看>>