如果p是一个指向数组中某个元素的指针,那么p++将会对p进行自增运算并指向下一个元素,而p+=i将对p进行加i的增量运算,使其指向指针p当前所指向的元素之后的第i个元素。这类运算时指针或地址算术运算中最简单的形式。
allocbuf中的空间使用状况也是我们需要了解的信息。我们使用指针allocp指向allocbuf中的下一个空闲单位。当调用alloc申请n个字符的空间时,alloc检查allocbuf数组中有没有足够剩余空间。如果有足够的空闲空间,则alloc返回allocp的当前值(即空闲块的开始位置),然后将allocp加n以使它指向下一个空闲区域。如果空闲空间不够,则alloc返回0。如果p在allocbuf的边界之内,则afree(p)仅仅只是将allocp的值设置为p
#define ALLOCSIZE 10000 /* 可用空间大小 */
static char allocbuf[ALLOCSIZE]; /* alloc使用的存储区 */
static char *allocp = allocbuf; /* 下一个空闲位置 */
char *alloc(int n) /* 返回指向n个字符的指针 */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* 有足够的空闲空间 */
allocp += n;
return allocp - n; /* 分配前的指针p */
} else /* 空闲空间不够 */
return 0;
}
void afree(char *p) /* 释放p指向的存储区 */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
一般情况下,同其他类型的变量一样,指针也可以初始化。通常,对指针有意义的初始化值只能是0或者是表达地址的表达式,对后者来说,表达式所代表的地址必须是在此前已定义的具有适当类型的数据的地址。例如
static char *allocp = allocbuf;
将allocp定义为字符类型指针,并将它初始化为allocbuf的起始地址,该起始地址
是程序执行时的下一个空闲位置。上述语句也可以写成下列形式:
static char *allocp = &allocbuf[0];
这是因为该数组明实际上就是数组第0个元素的地址。
指针的减法运算也是有意义的:如果p和q指向相同数组中的元素,且p<q,那么q-p+1就是位于p和q指向的元素之间的元素的数目。我们由此可以编写出函数strlen的另一个版本,如下图所示:
/* strlen函数:返回字符串s的长度 */
int strlen(char *s)
{
char *p = s;
while (*p != '\0')
p++;
return p - s;
}
在上述程序的的声明中,指针p被初始化为指向s,即指向该字符串的第一个字符。while循环语句将依次检查字符串中的每个字符,直到遇到标识字符数组结尾的字符’|0‘为止。