##简述
《C语言教程》-(美)Al Kelley Ira Pohl 著 徐波 译
“A Book on C” Programming in C, Fourth Edition
不是太厚的一本,内容比较基础的。
##关于指针
###指针
指针用于访问内存和操纵地址;而简单变量在机器中某特定内存位置(地址)按一定数量的字节存储。指针取值范围:包括特殊地址0及一组在特定C系统中被解释为地址的正整数。
例:
p= 0; // 0为特殊地址
p= NULL; //与p= 0;相同
p= &i; //将变量i的地址赋给指针变量p作为值
p= (int *) 1776; //类型强制转换,转为整型指针类型
*(解引用)和&(取地址):为取指针变量所指地址(指针变量的值)的值,&为取变量的值的地址,某些意义上说是&的逆操作。a:a的值;&a:a的地址;*p:指针p所指地址(p的值)的值。但在指针变量声明中int *p = &i;为给指针p赋值,*仅用于标识其为一指针变量。
例:
int a = 1, b = 2, *p;
p = &a;
b = *p; 等价于 b = a;
指针变量值的打印:用%p格式来打印指针的值,在ANSI C系统中,%p格式是推荐使用的。
指针变量初始化:可在声明中进行初始化,如变量类型是int *,初始值是&i。
指针变量赋值合法性:ANSI C中,不同类型指针间类型转换是不允许的,除非其中一种指针类型为void,或赋值符右边是常量0。
例:
无法由指针所指向的结构:不要指向常量-&3; 不要指向普通的表达式-&(k + 99); 不要指向寄存器变量-register v; &v。
###传引用调用
传引用调用机制:使用变量的地址作为参数传递给函数。当变量作为实参传递给函数时,它们的值被复制给对应的函数形参,变量本身的值在调用环境中并不会被修改,此为“传值调用”。
例:
void swap(int *p, int *q) //函数定义中使用指针
{
int tmp;
tmp = * p;
* p = * q;
* q = tmp;
}
//swap(&i, &j); //调用环境中把地址作为参数传递给函数
传引用调用实现步骤:把函数的一个形式参数声明为指针类型—在函数体中使用被解引用的指针—当这个函数被调用时,传递一个地址作为实际参数。
###数组和指针之间的关系
不同:指针变量可取不同的地址作为它的值,但数组名本身是个地址,是固定的。
a[i] 相当于 *( a + i)
p[i] 相当于 *( p + i)
表达式a + i的值是数组a的基地址向后偏移i个元素的位置,p + i是p值向后偏移i个元素的位置,这个偏移表达式的实际值取决于p所指向的类型。
例:
#define N 100
Int a[N], i , * p, sum=0; //设int占4个字节
假设系统把300这个地址分给该数组,作为其基地址,则300,304,308,…,696的内存地址分别分配给a[0],a[1],a[2],…,a[99]。
p = a; //等价于p = &a[0];
p = a + 1; //等价于p = &a[1];
a为常量指针(数组),以下表达式非法:a = p, ++a, a += 2。
###指针运算和元素的大小
指针运算:若p是某特定类型的指针,则p + 1, p + i, ++p, p += i表达式都是合法的。
例:
double a[2], * p, * q; // double假设占8字节
p = a;
q = p + 1;
printf(“%d\n”, q - p); //打印1
printf(“%d\n”, (int)q – (int)p); //打印8
##关于C的概述
C是模块化的,只支持一种风格的函数(外部函数),函数参数通过传值方式传递,不允许函数的嵌套,允许用static存储类型限制在文件内部。
C是C++和Java的基础。
##关于sizeof操作符
用于确定保存一个对象所需要的字节数量。
sizeof(object); 返回一整数(存储object所需字节数)。Object可以是int或float,也可以是a + b这样的表达式,或者是数组或结构类型。
##关于文件
FILE指针-ifp, ofp。指向文件的指针。
fopen(“my_file”, “r”);-该函数接收两个字符串类型的参数,并返回一个指向FILE的指针。
文件的写入是从文件的起始位置开始的。
##关于main()函数
Int main(int argc, char *argv[]) {}, main()函数可以接收两个参数:
argc参数表示参数的数量(argument count),它的值就是命令行的参数数量;
argv参数表示参数向量。
##关于随机数
rand()函数返回一个[0, RAND_MAX]之间的值。
srand(time(NULL));