公式:
- &arr[i] + j = &arr[i+j]
- arr+i = (&arr[0])+i = &arr[i]
- *(arr+i) = *(&arr[i]) = arr[i]
创建长度为 10000 的数组 allocbuf,所有的字符串都在这被分配空间,初始指针 allocp 指向 allocbuf[0]。
需编写方法 alloc 分配空间,参数是字符串长度 n。
假如现在 allocp = &allocbuf[4],要储存长度为 3 的 “abc”。先返回 &allocbuf[4],allocbuf[4] = ‘a’,allocbuf[5] = ‘b’,allocbuf[6] = ‘c’,allocp 很自然的指向 allocbuf[7]。
返回 allocp,并 allocp += n。
最后一个元素的地址 &allocbuf[9999] = &allocbuf[0] + 9999 = allocbuf + 9999。当数组被填满,如 allocbuf[0] = ‘a’, allocbuf[1] = ‘b’, … allocbuf[9999] = ‘z’,allocp = &allocbuf[10000],再也不能分配新的空间。allocp 的范围:&allocbuf[0] ~ &allocbuf[10000]。
allocp + n <= &allocbuf[10000]
&allocbuf[10000] = allocbuf + 10000
#include <stdio.h>
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char* alloc(int n) {
// 如果空间足够
if (allocp + n <= allocbuf + ALLOCSIZE) {
char *temp = allocp;
allocp += n;
return temp;
} else {
printf("空间不足!");
return 0;
}
}
void afree(char *p) {
if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p;
}
int main() {
// 返回 &allocbuf[0],allocp = &allocbuf[3]
char *p = alloc(3);
*p = 'a';
*(p+1) = 'b';
*(p+2) = 'c';
printf("%s\n", allocbuf);// abc
// 返回 &allocbuf[3],allocp = &allocbuf[5]
char *p2 = alloc(2);
p2[0] = 'd';
p2[1] = 'e';
printf("%s\n", allocbuf);// abcde
// allocp = &allocbuf[0]
afree(p);
// 返回 &allocbuf[0],allocp = &allocbuf[1]
p = alloc(1);
p[0] = 'z';
printf("%s\n", allocbuf);// zbcde
}
&arr[j] - &arr[i] = j - i
字符串 “abc”,arr[0] = ‘a’,arr[1] = ‘b’,arr[2] = ‘c’,arr[3] = ‘\0’,字符串长度 &arr[3] - &arr[0] = 3。
int strleng(char *s) {
// p = &s[0]
char *p = s;
while (*p != '\0') {
p++;
}
// 循环结束后,*p = '\0',p = &s[leng]
return p - s;
}
当拷贝到最后一个字符时,s++、t++,*s = *t = ‘\0’,while (‘\0’) 终止循环。
void strcpy(char *s, char *t) {
while (*s++ = *t++);
}
int main() {
int strend(char*, char*);
char s[] = "abc";
char t[] = "c";
printf("%d", strend(s, t));
}
// 如果 t 出现在 s 的尾部,返回 1,否则返回 0
int strend(char *s, char *t) {
char *p = t;
// 到达尾部
while (*s != '\0') {s++;}
while (*t != '\0') {t++;}
// 从尾部往头比较
for (; *s == *t; s--, t--) {
if (t == p) {
return 1;
}
}
return 0;
}