一個簡單的方法來解釋每一行所做的是把它擴大成等價代碼更容易,當你不太熟悉的指針和預/後遞增解析:
// *p++ = *r--;
*p = *r; // copies value in r over to p
p = p+1; // then increments p, so it now points to a+1
r = r-1; // and decrements r, so it points to a+1 too
// *++q = *r--;
q = q+1; // q now points to a+2
*q = *r; // places value at a+1 in a+2
r = r-1; // decrements r, so it points to a+0
// --*p; ++*q; --*r;
*p = *p-1; // decrements value at p, that is, a+1
*q = *q+1; // increments value at q, that is, a+2
*r = *r+1; // decrements value at r, that is, a+0
// displays values at a+0, a+1, and a+2
printf("%d %d %d", a[0], a[1], a[2]);
// displays values at a+1, a+2, and a+0
printf("%d %d %d", *p, *q, *r);
如果預增/ decrement在*之前,那麼你正在修改指針指向的位置的值;如果它在*之後,那麼你正在改變指針指向的位置。在後增加/減少表達式的情況下,如果要修改值,則需要使用圓括號:*p++
會更改p
指向並計算爲該值的值,(*p)++
將更改p
指向的值。
作爲一個有趣的**運動,下面的代碼,從The C Programming Language,複製從位置t
以零結尾的字符串s
:
void strcpy(char *s, char *t) {
while (*s++ = *t++);
}
**你的有趣的想法可以給K &的r不同。 strcpy
的使用已被證明會導致緩衝區溢出和過早的禿頭 - 使用strncpy
來代替。
? –
*「兩種不同的打印語句有什麼不同?」指針不再指向數組的基本元素。 –
除了嚼口香糖和詢問它是否保留了味道之外,這種類型的代碼究竟是什麼? –