江蘇電商網(wǎng)站開(kāi)發(fā)朋友圈廣告怎么投放
如果p是一個(gè)指向數(shù)組中某個(gè)元素的指針,那么p++將會(huì)對(duì)p進(jìn)行自增運(yùn)算并指向下一個(gè)元素,而p+=i將對(duì)p進(jìn)行加i的增量運(yùn)算,使其指向指針p當(dāng)前所指向的元素之后的第i個(gè)元素。這類運(yùn)算時(shí)指針或地址算術(shù)運(yùn)算中最簡(jiǎn)單的形式。
allocbuf中的空間使用狀況也是我們需要了解的信息。我們使用指針allocp指向allocbuf中的下一個(gè)空閑單位。當(dāng)調(diào)用alloc申請(qǐng)n個(gè)字符的空間時(shí),alloc檢查allocbuf數(shù)組中有沒(méi)有足夠剩余空間。如果有足夠的空閑空間,則alloc返回allocp的當(dāng)前值(即空閑塊的開(kāi)始位置),然后將allocp加n以使它指向下一個(gè)空閑區(qū)域。如果空閑空間不夠,則alloc返回0。如果p在allocbuf的邊界之內(nèi),則afree(p)僅僅只是將allocp的值設(shè)置為p
#define ALLOCSIZE 10000 /* 可用空間大小 */static char allocbuf[ALLOCSIZE]; /* alloc使用的存儲(chǔ)區(qū) */
static char *allocp = allocbuf; /* 下一個(gè)空閑位置 */char *alloc(int n) /* 返回指向n個(gè)字符的指針 */
{if (allocbuf + ALLOCSIZE - allocp >= n) { /* 有足夠的空閑空間 */ allocp += n;return allocp - n; /* 分配前的指針p */ } else /* 空閑空間不夠 */return 0;
}
void afree(char *p) /* 釋放p指向的存儲(chǔ)區(qū) */
{if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p;
}
一般情況下,同其他類型的變量一樣,指針也可以初始化。通常,對(duì)指針有意義的初始化值只能是0或者是表達(dá)地址的表達(dá)式,對(duì)后者來(lái)說(shuō),表達(dá)式所代表的地址必須是在此前已定義的具有適當(dāng)類型的數(shù)據(jù)的地址。例如
static char *allocp = allocbuf;
將allocp定義為字符類型指針,并將它初始化為allocbuf的起始地址,該起始地址
是程序執(zhí)行時(shí)的下一個(gè)空閑位置。上述語(yǔ)句也可以寫成下列形式:
static char *allocp = &allocbuf[0];
這是因?yàn)樵摂?shù)組明實(shí)際上就是數(shù)組第0個(gè)元素的地址。
指針的減法運(yùn)算也是有意義的:如果p和q指向相同數(shù)組中的元素,且p<q,那么q-p+1就是位于p和q指向的元素之間的元素的數(shù)目。我們由此可以編寫出函數(shù)strlen的另一個(gè)版本,如下圖所示:
/* strlen函數(shù):返回字符串s的長(zhǎng)度 */
int strlen(char *s)
{char *p = s;while (*p != '\0')p++;return p - s;
}
在上述程序的的聲明中,指針p被初始化為指向s,即指向該字符串的第一個(gè)字符。while循環(huán)語(yǔ)句將依次檢查字符串中的每個(gè)字符,直到遇到標(biāo)識(shí)字符數(shù)組結(jié)尾的字符’|0‘為止。