5.3 指针与数组
数组名实际就是一个地址,因为可以用指针的偏移来代表数组元素的地址:p=&a[0];a[i]=*(p+i);
但是值得注意的是指针它是一个变量,可以执行赋值,自增等操作,但是数组名是一个常量。
当数组作为参数调用函数时,实际上传入的数组的地址,因此跟指针实际上是等价的:f(char array[]) 等价于f(char * array).
5.4 地址算术运算
有效的指针运算包括相同类型指针之间的赋值运算;指针同整数之间的加法或减法运算;指向相同数组中元素的两个指针间的减法或比较运算;将指针赋值为0或指针与0之间的比较运算。其他所有形式的指针运算都是非法的,例如两个指针间的加法、乘法、除法、移位或屏蔽运算;指针同float或double类型之间的加法运算;不经强制类型转换而直接将指
向一种类型对象的指针赋值给指向另一种类型对象的指针的运算(两个指针之一是void*类型的情况除外)。
下面通过一个缩小版本的内存分配来说明指针的这些算术运算。
#include<stdio.h> #define BUFSIZE 1000 static char buf[BUFSIZE]; static char * pbuf=buf; char *alloc(int n) { if(buf+BUFSIZE-pbuf>=n) { pbuf=pbuf+n; return pbuf-n; } else return