“char * t = s + len”是什么意思?

时间:2014-08-01 00:05:47

标签: c string

我正在阅读一本编程书,我想知道一行代码是做什么的。书中没有任何评论或关于它应该做什么的解释。

下面是一个采用字符数组并向后打印的函数。

void print_reverse (char *s)
{
    size_t len = strlen(s);
    char *t = s + len -1;  // I don't understand what this line is doing
    while (t >= s) {
        printf("%c", *t);
        t = t - 1;
    }
    puts("");
}

2 个答案:

答案 0 :(得分:8)

我们说s是字符串"PaxDiablo",存储在位置1的内存中,因此:

         s
         |
         V
       +---+---+---+---+---+---+---+---+---+----+
       | P | a | x | D | i | a | b | l | o | \0 |
       +---+---+---+---+---+---+---+---+---+----+
Address: 1   2   3   4   5   6   7   8   9   10 

表达式t = s + len - 1(在这种情况下,len为9)将t设置为s之后的八个字符。

         s                               t
         |                               |
         V                               V
       +---+---+---+---+---+---+---+---+---+----+
       | P | a | x | D | i | a | b | l | o | \0 |
       +---+---+---+---+---+---+---+---+---+----+
Address: 1   2   3   4   5   6   7   8   9   10 

换句话说,它会为您提供字符串中 last 字符的地址。

然后,代码的其余部分向后迭代字符串,方法是递减t,直到它通过s


从技术上讲,这是未定义的行为,因为你只是每个人都应该比较一个字符上指向同一个数组的指针(这里我们比较t它的一个字符数组之前),但你很难找到一个不起作用的系统。

作为Potatoswatter(我绝对人们在此处选择的一些名字)在评论中指出,你可以通过使用do {} while构造而不是{{while {}来避免这种比较1}}:

#include <stdio.h>
#include <string.h>

void printReverse (char *str) {
    size_t len = strlen (str);
    if (len != 0) {
        char *pStr = str + len;
        do {
            putchar (*(--pStr));
        } while (pStr > str);
    }
    putchar ('\n');
}

答案 1 :(得分:1)

我们说s指向字符串"Hello"。在内存中,它看起来像:

s --> [ H | e | l | l | o | \0 ]

现在,char *t向char值声明一个新的指针变量,该值使用s + len - 1初始化,即:

s ------                    ------- s + 5   // (len is 5 since strlen("Hello") is 5)
       |                    |
     [ H | e | l | l | o | \0 ]
                       |
                       ------------ finally, t = s + len - 1