char *、内存地址、ASCII码是什么关系?

What is the relationship between char *, memory addresses, and ASCII code?

当我取消引用 *str + i 时,为什么我的代码会这样?我知道,如果我要尝试一个一个地打印字符串的每个字符,我会做 str[i] 而不是 *str + i,但我想看看这里发生了什么。

计算机是不是识别'A'是第一个字母,找到'A'的内存位置,然后直接通过ASCII table往上走?似乎在计算机中只有 一个 存储字母 'A' 的位置,我找到了它,然后因为 char 是一个字节,所以它刚刚通过for 循环中的其余 ASCII table。

谢谢!

输入:

char *str1 = "Abc";

for (int i = 0; i < 30; i++)
{
    printf("letter: %c - ", *str1 + i);
    printf("memory address: %p", &str1 + i);
    printf("\n");
}

输出:

letter: A - memory address: 0x7ffea8ea9510
letter: B - memory address: 0x7ffea8ea9518
letter: C - memory address: 0x7ffea8ea9520
letter: D - memory address: 0x7ffea8ea9528
letter: E - memory address: 0x7ffea8ea9530
letter: F - memory address: 0x7ffea8ea9538
letter: G - memory address: 0x7ffea8ea9540
letter: H - memory address: 0x7ffea8ea9548
letter: I - memory address: 0x7ffea8ea9550
letter: J - memory address: 0x7ffea8ea9558
letter: K - memory address: 0x7ffea8ea9560
letter: L - memory address: 0x7ffea8ea9568
letter: M - memory address: 0x7ffea8ea9570
letter: N - memory address: 0x7ffea8ea9578
letter: O - memory address: 0x7ffea8ea9580

等等等等等

写的时候

char *str1 = "ABC";

内存看起来像这样:

+---+---+---+---+
| A | B | C | [=11=]|
+---+---+---+---+
  ^
  |
+---+
|   | str1
+---+
  

考虑到这一点,

*str + i

做什么?好吧,C 将其解释为“给我 str 指向的字符,然后向其添加 i。”由于str1指向字符串的第一个字符,所以*str的值为'A'。将 i 添加到 'A' 然后开始按顺序推进字母表中的字符,这就是为什么你会看到 A,然后是 B,然后是 C,等等。

另一方面,当你写

&str1 + i

C 将其解释为“给我变量 str1 的地址,然后向前移动 i 个位置。”因此,例如,&str1 + 0str1 指针的地址,那么 &str1 + 1str1 后一个 char* 位置的内存地址等。但这些地址中的 none,除了 &str1 + 0,实际上代表任何东西。

如果要查看数组元素的地址,只需写str1 + i。这意味着“去 str1 点,然后前进 i 个位置。”