[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 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...
随机推荐
- 161125、Java网络编程之统一资源定位符URL
统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是: <M ...
- Android的init过程(二):初始化语言(init.rc)解析【转】
转自:http://www.cnblogs.com/nokiaguy/p/3164799.html Android的init过程(一) 本文使用的软件版本 Android:4.2.2 Linux内核: ...
- Aspose.Words操作word生成PDF文档
Aspose.Words操作word生成PDF文档 using Aspose.Words; using System; using System.Collections.Generic; using ...
- Dynamics AX 2012 R2 Service Middle Tier WCF WCF转发
参考了蒋金楠老师08年的文章.好吧,那时候我才大二.大三,大神果然是大神. http://www.cnblogs.com/artech/archive/2008/09/01/1280939.html ...
- Xcode 证书问题报错锦集
Xcode因为证书问题经常报的那些错 字数495 阅读13559 评论20 喜欢47 去年才开始做 iOS开发的时候,因为证书问题 Xcode 经常报这样或那样的错,经过一年多的实践,现在看见 Xco ...
- 【PHP设计模式 06_GuanChaZhe.php】观察者模式
<?php /** * [观察者模式] * PHP5中提供了 观察者(observer) 和 被观察者(subject) 的接口 * 在手册搜索:SplSubject (PHP 5 >= ...
- ectouch第二讲之 文件结构
相信大家在ectouch官网都注意到了,ectouch采用的MVC框架,之前一直以为它用的和ecshop一样都是smarty,本鸟默默按照smarty的文件结构研究了好几天,结果是各种文件对不上号.无 ...
- HDU 4405:Aeroplane chess(概率DP入门)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Problem Description Hzz loves ...
- python: 字符串按空格分成列表split与加密密码maketrans
#字符串按空格分成列表split() print("fu li mei".split()) #split按空格分成列表 print("1+a+2+b".spli ...
- SDUT 2877:angry_birds_again_and_again
angry_birds_again_and_again Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 The problems ...