比较指针

Comparing pointers

此代码用于将整数转换为字符数。我不明白为什么这个 while 循环的 conditionwhile(savestr < str) 在循环结束之前为真?!

 while(savestr < str) {
          temp = *str ;
          *str-- = *savestr ;
          *savestr++ = temp ;

contion 在哪些方面起作用? ASCII 值?那么在 ASCII 值方面,循环条件是如何工作的?!

代码如下:

#include <stdio.h>
#include <conio.h>
void int_to_ascii(int , char *);
int main()
{
    int number ;
    char s[10] ;
    clrscr();
    printf(" enter a number :");
    scanf("%d", &number) ;
    int_to_ascii(number, s) ;
    printf(" the string value is:%s", s);
    getch();
    return 0;
}
//**********************************
void int_to_ascii(int value, char *str)
{
    int saveval= value ;
    char temp, *savestr = str ;
    if(value < 0)
    value *= -1 ;
    do{
    *str++ = (value % 10) + 48 ;
    value = value / 10 ;
    } while(value > 0);
    if (saveval < 0)
       *str++ = '-' ;
    *str-- = '[=11=]' ;
    while(savestr < str) {
      temp = *str ;
      *str-- = *savestr ;
      *savestr++ = temp ;
    }
}

这个循环:

    do {
        *str++ = (value % 10) + 48;
        value = value / 10;
    } while (value > 0);

通过获取最后一位数字 (value % 10) 将 value 转换为数字,添加字符“0”的 ASCII 码 (48),并将总和放入 str (*str =)。它还递增 str 以指向内存中的下一个 space (*str++ =)。添加“0”的代码是可行的,因为在 C 中,数字字符“0”到“9”的代码是连续的(在 ASCII 中:48、49、50、51、52、53、54、55、56、 57).所以,如果 value (value % 10) 的最后一位是 5,则 48 加 5 得到 53,即“5”的代码。

没有理由在这里使用48。代码最好写成*str++ = (value % 10) + '0';。这有两个好处:它让 reader 清楚地知道我们正在为字符“0”添加代码;他们不需要记住或弄清楚 48 是什么。并且它消除了使用 ASCII 的假设;此代码将与其他字符代码方案一起使用。

然后 value = value / 10; 删除最后一位数字,如果有的话,保留 value 前面的数字。如果还有数字,while (value > 0) 继续循环。

当这个循环完成后,str最初指向的内存中包含value的数字字符。但是,它们是倒着写的,因为我们先写了最后一位,最后写了第一位。 str 现在指向字符的末尾(比最后一个字符高一个位置)。 savestr中保存的值指向第一个位置。

此代码:

    if (saveval < 0)
        *str++ = '-';
    *str-- = '[=11=]';

如果值为负则添加一个负号,然后添加一个空字符来标记字符串的结尾。它使 str 指向空字符之前的最后一个位置。

因为数字是倒序写的,所以我们必须把它们倒过来。这个循环是这样做的:

    while (savestr < str) {
        temp = *str;
        *str-- = *savestr;
        *savestr++ = temp;
    }

savestr < str 为真,只要 savestr 指向分配内存中比 str 更早的位置。比较两个指针时,如果它们指向同一数组中的元素,则如果它指向较早的元素(数组索引较低的元素),则一个指针小于另一个指针。最初,savestr 指向字符串中的第一个字符,str 指向最后一个字符(在终止空字符之前)。

然后:

  • temp = *str;记住str指向的字符。
  • *str-- = *savestr;savestr 指向的字符移动到 str 指向的位置,并且由于 --,它递减 str 指向内存中较早的位置。
  • *savestr++ = temp; 将记住的字符放在 savestr 指向的位置,并且由于 ++,它递增 savestr 以指向内存中的稍后位置。

因此,字符串中较早的字符与字符串中较晚的字符交换,并且 savestr 前进到字符串中较晚的位置,而 str 移动到字符串中较早的位置。最终,savestrstr相遇或交叉,while条件savestr < str变为假,此时循环停止,字符串已反转。