预编译
程序从编辑到执行的过程:
预编译的输入是源程序(文本文件),输出依然是源程序(文本文件), 只不过作了一些替换而已.
1. #define 预编译指令
也称为宏定义. 在计算机技术中, 宏的意思是用一个字符序列替换另一个字符序列.
例:
以下是用字符序列3.14 替换字符序列 PAI
- #include 预编译指令
8地址、指针与内存的分配
以上引自于Kerniigan & Ritchie “ The C Programming Language” 第2版 第5章
★C程序中的内存分配有四种形式:①定义各种形式的变量;②定义数组;③动态内存分配;④字符串常量。
★在C程序中可以利用地址 对 当前有效分配给本程序的内存
进行读写操作;
(“当前”指:虽然过去有效分配了,但已释放了,即过期不行,
比如,某函数的自动变量,在函数调用结束后,就不应该对其进行
读写操作; “有效”指:内存被成功地分配给本程序,比如,不成功的动态内存分配)
★ 不能通过地址 对 通过字符串常量分配的内存 进行写操作;
★ C中的地址除了值之外,还有在 以这个地址值开始的内存区域中 所存对象的类型的信息,所谓C 中地址是“两位一体”。
★ C语言中有专门存放地址的变量,就是指针,或(指针变量)。
8.1 C语言中的地址
一谈到C语言中的地址,头脑中就应该反应到,地址有两个要点,或者说含有两个重要的信息,或者说地址是“两位一体”。
1) 地址值是多少?
2) 以该地址值为首地址的内存单元(们)所存的“东西”是什么类型?
比如:
int x; 给你的程序分配了4个字节的内存(整型变量,变量名为x),你可以通过变量名x来存或取整数(即通过变量名x来引用这个变量)。
假定为x分配的内存是以地址0x0012ff44开始的4个字节
在C中变量x的地址可由以下操作(运算)得出:&x
值为:0x0012ff44 (首字节地址值)
&x
是存int型数据的内存的地址,或内存中以这个地址值开头的若干(4)内存单元里所存东西的类型是int
通过运算 *(地址):可以对该地址所对应的内存区域进行某种类型(int)数据的读写操作。
比如:
*(&x)=6; //将整数6以“int 格式”写入以0x0012ff44为首地址的四个字节中,相当于x=6;
b=*(&x)+9; // 将以0x0012ff44为首地址的四个字节中的0,1读出,并将其作为“int 格式”的数// 据,相当于b=x+9;
printf(“%d”, *(&x)); 输出 6。
于是: *(&x)就等价于x
再比如:
float y; // 分配了4个字节的内存,浮点型变量,变量名为y
假定 y的地址为0x0012ff40
在C中变量y的地址可由以下操作(运算)得出:&y
值为:0x0012ff40 (首字节地址值)
&y
是存float型数据的内存的地址,或该地址值开始的内存单元上所存东西的类型是float型
运算 *(地址):可以对该地址所对应的内存区域进行某种类型(float)数据的读写操作。
比如:
*(&y)=3.14; //将3.14以“float 格式”写入以0x0012ff40为首地址的四个字节中,相当于y=3.14;
z=*(&y)/4.0; // 将以0x0012ff40为首地址的四个字节中的0,1读出,并将其作为“float格式”的//数据参与表达式的计算,相当于z=y/4.0;
printf(“%f”, *(&y)); 输出 3.140000。
*(&y)就等价于y
这有神马意思?后面讲 。“变量里的数据是活的(变化的),指针所指的变量是活的”
第二个侧面信息的作用:
一
*(&x)之所以能够将0x0012ff44 地址上的东西作为整型变量,都是因为&x中含有该地址所对应内存中所存数据的类型的信息
*(&y)之所以能够将0x0012ff40 地址上的东西作为浮点类型变量,都是因为&y中含有该地址所对应内存中所存数据的类型的信息
二
&x+1 也是一个地址,值为0x0012ff48,因为一个整型四个字节,此处自动地“以一当四”。
&y+1 也是一个地址,值为0x0012ff44,因为一个浮点型四个字节,此处自动地“以一当四”。
第二个侧面信息 “是存float型数据的内存的地址” 或“该地址开始的内存单元上所存东西的类型是float型” 程序中用以下符号 表达 float *
第二个侧面信息 “是存int型数据的内存的地址” 或“这个地址上所存东西的类型是整形” 程序中用以下符号表达 int *
8.2指针(指针变量)是存放地址的变量
1)指针变量的定义:
“是某类型的地址” 变量名;
比如
int * pi;
int a, *pa;
pa=&a;
*pa=4;
printf(“%d\n”,a);
则输出: 4
以上 pi, pa 都是变量,在内存中各占四个字节.(为什么?)
2)利用地址以及指针对内存进行读写操作
定义变量是分配内存的一种手段
例li0803 本例说明可用指针(指针变量)对内存进行相应类型数据的读或写。