[C程序设计语言]第二部分
字符串常量与字符数组... 1
字符串... 2
枚举常量... 3
C程序存储空间布局... 3
四种存储类别... 4
static. 5
const. 7
sizeof8
register. 8
位移规则... 9
函数默认返回值... 9
运算符的优先级
运算符 | 结合性 |
() [] -> . | 从左至右 |
++ -- + - ! ~ (类型) * & 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). 如果函数定义中省略了返回值类型,则默认为int类型。
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填补(即“逻辑移位”)。
函数默认返回值
[C程序设计语言]第二部分的更多相关文章
- C程序设计语言(第二版)习题:第一章
第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
- awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
- 20155304田宜楠 2006-2007-2 《Java程序设计》第二周学习总结
20155304田宜楠 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一.类型与变量 1.类型 整数: 可细分为为short整数(占2字节),int整数(占 ...
- 201521123038 《Java程序设计》 第二周学习总结
201521123038 <Java程序设计> 第二周学习总结 1.本章学习总结 学会在Java程序中使用函数,使程序层次更清晰 使用StringBuilder编写代码,减少内存空间的占用 ...
- 《C++程序设计语言(十周年纪念版)》【PDF】下载
<C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...
- 《程序设计语言——实践之路》【PDF】下载
程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...
随机推荐
- Android多线程通信之Handler
主线程 public class MainActivity extends ActionBarActivity { private Handler handler; // private Thread ...
- IMG图片和文字同行显示
只要设定img标签的vertical-align CSS属性就好了,代码如下: <img src="images/untitled.png" style="widt ...
- Hadoop之回收站
一.回收站简介: 在HDFS里,删除文件时,不会真正的删除,其实是放入回收站/trash,回收站里的文件可以快速恢复. 可以设置一个时间阀值,当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文 ...
- PostgreSQL Hot Standby的搭建
一. 简介: PG在9.*版本后热备提供了新的一个功能,那就是Stream Replication的读写分离,是PG高可用性的一个典型应用.这个功能在oracle中叫active d ...
- GHOST出错
error 15:file not found grub问题VFS:Cannot open root device "sda" or unknow-block 可能是磁盘驱动程序问 ...
- springMVC配置freemarker 二(问题讨论篇)
上面一篇我已经说明了如何去配置freemarker,这里我就谈谈遇到的问题吧. 首先, 为什么要删除上面之前的.你要使用freemarkerviewresolver和上面的冲突了,因此要注释掉上面的. ...
- Animation Play/Stop测试
测试结果: 1.当切换不同动画播放,可以直接调用Play或者CrossFade.会立即切过去 2.当相同动画再次播放,又想打断重头再播,需要先调用Stop. anim.Play("Test1 ...
- PHP比较运算!=和!==
PHP!=和!==的区别 !==是指绝对不等于,比如,$a = 3, $b="3" 那么,$a!==$b成立,可是$a!=$b不成立:
- HDU 4810 Wall Painting
Wall Painting Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 2014江西理工大学C语言程序竞赛高级组
Beautiful Palindrome Number 题意:求N里面有多少个符合要求的数字(数字要求:回文数,且前一半部分是不严格递增) 解法:打表 #include<bits/stdc++. ...