int d = 5, result; float f = 6.382; result = d * (int) f; |
//声明整型变量并赋值 //声明单精度浮点型变量并赋值 //将变量强制转换为整型再计算 |
此例的计算结果为 30, 在运算之初已将变量 f 强制转换为整型。假若没有使用构成符,
表达式 result = d * f 的结果为 31,因为变量首先被转换成单精度浮点型运算,然后赋值时
再被转为整型。
C 语言中的简写形式
c = c / ( a * b - c % b++ ); c /= a * b - c % b++; |
//原表达式 //简化后的表达式 |
C 语言的预处理命令
宏替换命令
#define 标识符 字符串
#define MAX(a, b) (a >= b) ? a : b | //定义宏替换 MAX(),当 a 大于或等于 b 时 //返回 a 值,否则返回 b |
int main() { int x = 190, y = 106; printf("MAX: %d", MAX(x, y)); |
|
//定义整型变量 x、 y 并赋值 //输出 x 和 y 中较大的一个,使用宏代换 |
终止编译命令
#error 错误信息字符串
文件包含命令
#include "filename.h"
#include <stdio.h>
这两行代码都使编译器读入并编译头文件或源代码文件。双引号用于包含指定相对路
径的文件,若未指明相对路径,则会在当前源文件所在的目录内检索。如果文件没找到,
则检索标准目录,不检索当前工作目录。尖括号用于包含标准函数库文件和用户在编译指
令里所指明的函数库文件,系统会在这些函数库中搜索指定文件。
指针的例子:
#include <stdio.h>
int main(){
int i,*pi;
char c[]={97,98,99,100,101};
char *p;
p=c;
printf("%c\n",*p++);
printf("%c\n",*p++);
printf("#######\n");
i=4;
pi=&i;
printf("%d\n",*pi++);
printf("%d\n",(*pi)++);
printf("%d\n",i);
return 0;
}
结果如下:
a
b
#######
4
10485312
4
指针与一维数组
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;//定义整型数组 i 和整型指针变量*pi
pi = i; //将指针变量*pi 指向数组 i 的首地址
该赋值操作等同于“ pi = &i[0]”
- “ pi + n”或“ i + n”表示数组元素 i[n]的地址,即“ & i[n]”。数组 i 有 10 个元素,n 的取值为 0 至 9,则数组的地址可表示为“ pi + 0”至“ pi + 9”,或“ i + 1”至“ i + 9”,与&i[0]至&i[9]的作用一样。
- 知道了数组元素的地址表示方法,“ *( pi + n)”和“ *(i + n)”就表示为数组的各元素即等效于 i[n]。
- 指向数组的指针变量也可用数组的下标形式表示为 pi[n],其效果相当于“ *(pi +n)”。
指针与二维数组
int i[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;
pi = i[0];
如果要访问其中的元素i[1][2],则可用公式 1 × n + 2 得到该元素的位置,引用时可写作“ *( pi + 1 * n + 2)”。
二维数组每一行都有一个首地址,如 i[0]代表&i[0][0]的地址, i[1]代表 i[1][0]的地址。因此,二维数组也可以被看作 m 个长度为 n 的一维数组,引用二维数组需要将每行的首地址赋给指针变量。
指针与字符串数组
字符型指针变量指向字符串数组首地址后,该指针即可当作字符串使用。
puts()函数的作用是将字符串无格式输出,当*pc 作为其参数时,会内存中将*pc 所指向的地址开始,到字符串结束符之间的字符输出到终端。
如果字符数组中没有字符串结束符,则调用 printf()或 puts()输出函数后程序会出错(一直向后处理,输出很多意想不到的字符,直到遇到值为 0 的内存块)。如果字符型指针变量没有初始化,可能会造成严重影响,如下列源代码所示。
因为 pc 的值不可知, pc 可能指向内存中的任意位置。将字符串保存到 pc 所指向的内存单元中,可能造成非常严重的系统错误。这种用法称之为无源指针,在程序中应避免出现。
指针的地址分配
GCC 编译器支持动态分配内存的函数 malloc()和 free(), 它们包含在头文件 stdlib.h 中。动态内存分配的含义是在程序执行的过程中,动态地划分内存空间供程序使用。当程序不需要使用这些内存空间,则可以将其释放。 malloc()函数的作用是向操作系统申请内存, free()函数的作用是释放所申请的内存。
指 针 数 组
指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址。指针数组的定义形式为:
数据类型 *数组名[长度];
指向常量的指针,必须用 const 定义为常量指针,以避免修改该指针所指向的数据造成程序错误。由于[ ]符号比间接运算符*的优先级要高,所以首先是数组形式 c[4],然后才是与*结合。这样,指针数组内包含 4 个指针 c[0]、 c[1]、 c[2]和 c[3],分别指向 4 个字符串的首地址。
指向指针的指针
数据类型 **变量名;