有效的指针运算:包括相同类型指针之间的赋值运算;指针同整数之间的加减运算;指向相同数组中元素的指针之间减法或比较运算;将指针赋值为0或指针与0之间的比较运算;其他所有形式的指针运算都属于非法的。
分配内存,释放内存
#define ALLOCSIZE 10000 /* 给予空间总大小 */
static char allocbuf[ALLOCSIZE]; /* 将总空间抽象为一个数组,实质还是一个指针 */
static char *allocp = allocbuf; /* 闲置空间起始指针allocp,初始化为数组起始位置 */
char *alloc(int n) /* 分配空间后,返回分配空间的起始位置指针 */
{
if (allocbuf + ALLOCSIZE - allocp>= n)
{
allocp += n;
return allocp-n;
}
else
{
return 0;
}
}
void afree(char *p) /* 释放空间,实质只是移动闲置空间起始位置指针 */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
这里的内存分配与释放,本质上,只是指针的移动
注意
- 在计算p+n时,n将根据p指向对象的长度按比例缩放,而p指向对象的长度取决于p的声明,例如,int类型占4个字节的长度,那么在int类型的计算中n将按照4的倍数计算
- 指针与整数之间不能进行转换,但0是唯一的例外:0可以赋值给指针,指针也可以与0进行比较,程序中经常使用符号常量NULL代替0。 0是指针的一个特殊值