声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4256051.html

运算符的优先级

运算符 结合性
() [] -> . 从左至右
++  --  +  -  !  ~  (类型)  *  &  sizeof 从右至左
*  /  % 从左至右
+  -  从左至右
<<  >> 从左至右
<  <=  >  >= 从左至右
==  != 从左至右
& 从左至右
^ 从左至右
| 从左至右
&& 从左至右
|| 从左至右
?: 从左至右
=  +=  -=  *=  /=  %=  &=  ^=  |=  <<=  >>= 从右至左
, 从左至右

字符串常量与字符数组

从技术角度看,字符串常量就是字符数组。字符串的内部表示使用一个空字符 \0 作为串的结尾,因此,存储字符串的物理存储单元数比在括在双引号中的字符数多一个。这种表示方法也说明,C语言对字符串的长度没有限制,但程序必须扫描完整个字符串后才能确定字符串的长度。标准库函数strlen(s)可以返回字符串s的长度,但长度不包括末尾的 \0。

字符串

char *str = "abcd";//可以将字符串赋给一个 char * 类型的变量
    printf("%c\n",*str);//a
    printf("%s\n",str);//abcd
下面结果一样:
    char ca[] = "abcd";//也可以将字符串赋给一个字符数组
    printf("%c\n", *ca);//a
    printf("%s\n", ca);//abcd
    printf("%d\n", sizeof(ca));//5
 
C语言中的字符串是用空字符 \0 结束的字符数组。字符串是用指向字符串中第一个字符的指针访问的。字符串的值是其第一个字符的地址。因此,C语言中的字符串就是一个指针,事实上,字符串就是指向其第一个字符的指针。
 
在用字符串直接量初始化char *类型的变量时,某些编译器可能会把该字符串放在不能修改该字符串的某个存储单元中,所以,个元素,空字符用字符常量 \0 表示,C语言中的所有字符串都是用该字符结束的。在声明一个字符串的字符数组时(指定数组大小时),数组的大小应该能够足以容纳字符串中的字符和结束该字符串的空字符。也可以在初始化值列表中用单个字符常量初始化字符数组:char string[] = { 'f', 'i', 'r', 's', 't', '\0' };,这与前面的定义等价。又,第二个为1,依次类推。如果只指定了部分枚举名的值,那么指定值的枚举名的值将依着最后一个指定值值向后递增。

C程序存储空间布局

C程序一直由下列部分组成:
      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
      4)栈——自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
      5)堆——动态存储分。int c* = (int *)malloc(sizeof(int));分配的空间就存储在堆里。
|-----------|
|           |
|-----------|
|    栈     |
|-----------|
|    |      |
|   \|/     |
|           |
|           |
|   /|\     |
|    |      |
|-----------|
|    堆     |
|-----------|
| 未初始化  |
|-----------|
|   初始化  |
|-----------|
|  正文段   |
|-----------|

四种存储类别

实际上,程序中的每一个标识符有以下几种属性:存储类别、存储期、作用域、连接(linkage).
auto register extern static
标识符的存储类别有助于确定其存储期、作用域和连接
 
存储期:标识符在内存中的存在期
作用域:可引用标识符的区域
连接:对于有多个源文件的程序,该标识符是只被当前源文件识别,还是因为用了合适的声明而被所有源文件识别。
 
四种存储类别说明符有两种存储期:自动存储期和静态存储期。
 
自动存储期变量在进入声明该变量的程序块时建立,退出该程序块时撤销。只有变量才有自动存储期。函数的局部变量(参数与函数体中声明的变量)通常具有自动存储期。
 
关键字auto明确地声明了具有自动存储期的变量,auto float x,y;因为局部变量在默认情况下具有自动存储期,所以很少使用关键字auto。
 
具有自动存储期的变量简单地称为自动变量。
 
因为局部变量在只在需要的时候存在,所以自动存储是节省内存的一种方法。
 
在自动变量声明前使用存储类型说明符register可
   3)作用域:静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效(准确地讲从定义之处开始到文件结尾),在同一源程序的其它源文件中不能使用它。非静态全局变量的作用域是整个源程序(多个源文件可以共同使用)。
static)内存中的位置:静态存储区
2)初始化:对基本类型的静态局部变量若在说明时未赋以初值,则值。而对自动变量不赋初值,则其值是不定的
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束。退出该函数后,尽管该变量还继续存在,但不能使用它。
当static用来修饰全局变量的时候,它就
    /*
     * 可以修改其指向。数组在作为参数传递时,实质上传递的
     * 是第一个元素的地址,这里的参数声明好比为 int *a,但
     * 如果不是做为参数这样声明时,则是不能够再次让数组变量
* 指向另外一个新的数组
     */
    a = b;
    // 编译出错:assignment of read-only location '*a'
    // a[0] = 3;
    printf("%d\n", a[0]);//输出:1
}
int main(void) {
    int a[] = { 2 };//这里 int a[] 相当于 int * const a
    val(a);   
    printf("%d\n", a[0]);//值还是2,没有被修改
int b[] = { 1 };
    //! a = b;//不能使用数组变量指向新的数组,但在参数声明时可以
    return 1;
}
数组名实际上是一个指向非常量的常量指针。
 
当遇到形如一维数组
unsigned类型的无符号值进行右移位时,左边空出的部分将用0填补;当对signed类型的带符号值进行右移时,某些机器对左边空出的位用符号位填补(即“算术移位”),而另一些机器对左边空出的部分用0填补(即“逻辑移位”)。

函数默认返回值

如果函数定义中省略了返回值类型,则默认为int类型。
 

[C程序设计语言]第二部分的更多相关文章

  1. C程序设计语言(第二版)习题:第一章

    第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  4. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

  5. awk程序设计语言之-awk基础

    awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...

  6. 20155304田宜楠 2006-2007-2 《Java程序设计》第二周学习总结

    20155304田宜楠 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一.类型与变量 1.类型 整数: 可细分为为short整数(占2字节),int整数(占 ...

  7. 201521123038 《Java程序设计》 第二周学习总结

    201521123038 <Java程序设计> 第二周学习总结 1.本章学习总结 学会在Java程序中使用函数,使程序层次更清晰 使用StringBuilder编写代码,减少内存空间的占用 ...

  8. 《C++程序设计语言(十周年纪念版)》【PDF】下载

    <C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...

  9. 《程序设计语言——实践之路》【PDF】下载

    程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...

随机推荐

  1. struts2 笔记04 杂记

    流程: 1. StrutsPrepareAndExcuteFilter:StrutsPrepareAndExcuteFilter作为前端控制器,是整个Struts2的调度中心. 2. ActionMa ...

  2. SoupUI的使用

  3. cpu进程调度---RT Throttling【转】

    转自:http://book.2cto.com/201302/16291.html RT Throttling是对分配给实时进程的CPU时间进行限制的功能.使用实时调度策略的进程由于bug等出现不可控 ...

  4. How To Create a SSL Certificate on Apache for CentOS 6

    About Self-Signed Certificates 自签证书.一个SSL证书,是加密网站的信息,并创建更安全的链接的一种方式.附加地,证书可以给网站浏览者显示VPS的的身份证明信息.如果一个 ...

  5. linux man

    man能够为除命令之外的配置文件.系统调用.库调用等都能提供帮助手册,他们分别位于不同的章节中: 1.用户命令 2.系统调用 3.库调用 4.设备文件 5.配置文件 6.游戏 7.杂项 8.管理命令

  6. 记录一下:chrome上,把网页保存为文件的插件

    插件地址: https://chrome.google.com/webstore/detail/full-page-screen-capture/fdpohaocaechififmbbbbbknoal ...

  7. python8

    编译和解释性语言的区别 编译 典型的C C++ 编译完成之后是可执行文件. 机器码-底层(外文书,但是不懂中文,翻译成中文就可以看) 解释性语言----看一句英文书,让翻译解释一句 解释器写的代码便于 ...

  8. Android invalidate() 和 postInvalidate()的区别

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  9. 棋盘问题 分类: 搜索 POJ 2015-08-09 13:02 4人阅读 评论(0) 收藏

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28474 Accepted: 14084 Description 在一 ...

  10. UML类图几种关系的总结(转)

    原文:http://gjhappyyy.iteye.com/blog/1422515 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), ...