[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 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...
随机推荐
- 160902、Ionic、Angularjs、Cordova搭建Android开发环境
1.jdk 环境变量配置 path:C:\Program Files\Java\jdk1.7.0_79\bin 2.node.js 因为安装cordova时要用到node.js的npm 下载地址: h ...
- GPS模块的AT指令集
AT+CPIN? 查询sim卡状态. 接着: AT+CGCLASS="B"AT+CGDCONT=1,"IP","CMNET"AT+CGATT ...
- ubuntu安装最新版本的node.js
下面的方法适用于最新版本的Ubuntu.Ubuntu 12.04 LTS.Ubuntu 12.10.Ubuntu 13.04等版本.它可以帮助开发者在Ubuntu上安装Node.js,无需从头编译安装 ...
- Delphi的DateToStr StrToDate格式灵活用法
Delphi的DateToStr StrToDate格式灵活用法 2008-04-09 10:19 procedure TForm1.Button1Click(Sender: TObject);var ...
- mysql多实例部署
mysql 多实例常规来讲,主要有二种方案可以实现,这二种方案各有利弊,如下:1.基于多配置文件 通过使用多个配置文件来启动不同的进程,以此来实现多实例. 优点:逻辑简单,配置简单 缺点:管理起来不方 ...
- Java中的线程同步机制
一.首先为什么线程需要同步? 1.多线程安全问题的原因 A:有多线程环境 B:有共享数据 C:有多条语句操作共享数据 2. //未完待续后面会继续更新
- js获取IP地址方法总结_转
js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...
- Java遍历Map的3种方式
package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...
- Dynamics AX 2012 R2 Business Connector Error
6.0: AxCryptoClient - New encryption key created 6.0: Unable to InitializeSession. 6.0: No built-in ...
- GCD 多线程同步
@property (strong, nonatomic) dispatch_queue_t barrierQueue; _barrieQueue = dispatch_queue_create(&q ...