为什么我可以减去两个指针并将结果用作大小?

Why can I subtract two pointers and use the result as a size?

在此代码段中,strncpy 具有 n 值作为两个 char 指针的差值。如何减去两个字符串指针?这里n的值是多少?

程序确实编译成功,但大小是否必须是 int 值?

void replace(char *s1) { 
    char r[4][5] = { "get", "tell", "your", "house" };
    char rep[4][10] = { "see", "us", "tall", "kite" };
    char buff[500];
    int i;
    char *ch;

    for (i < 0; i < 4; i++) { 
        if ((ch = strstr(s1, r[i]))) {
            strncpy(buff, s1, ch - s1);
            buff[ch-s1] = 0; 
            sprintf(buff + (ch - s1), "%s%s", rep[i], ch + strlen(r[i])); 
            s1[0] = 0; 
            strcpy(s1, buff);

            return replace(s1);
        }
    }
}

如果您有两个指向同一个数组的指针 p 和 q,则 p - q 的计算结果为数组中 p 和 q 之间的(有符号)元素数。例如,考虑以下代码:

int array[137];
int* p = &arr[10];
int* q = &arr[5];

ptrdiff_t diff = p - q;

这里p指向数组的第十个元素,q指向数组的第五个元素,所以p-q就是5。 (特殊类型 ptrdiff_t 是一个整数类型,它的大小足以容纳任意两个指针的差值。)

解释这种差异的另一种方法是问“如果我们想象数组从 q 指向的位置开始,指针 p 指向什么索引?”在这种情况下,答案是五,因为如果我们将 q 视为数组的基数,那么 p 的索引将是五。在你的例子中,你的指针 ch 被设置为等于 strstr 的 return 值,所以它指向 s1 中间的某个地方。表达式 ch - s1 则表示“ch 指向的字符串中的位置。”

打个比方space中的点:如果你有两个点p和q,你可以把p - q想成一个向量,代表你从q到p需要走的方向。但是,你不能有意义地将点 p 和 q 相加得到 p + q,就像你不能在 C 中相加两个指针一样。