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 + 0
是 str1
指针的地址,那么 &str1 + 1
是 str1
后一个 char*
位置的内存地址等。但这些地址中的 none,除了 &str1 + 0
,实际上代表任何东西。
如果要查看数组元素的地址,只需写str1 + i
。这意味着“去 str1
点,然后前进 i
个位置。”
当我取消引用 *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 + 0
是 str1
指针的地址,那么 &str1 + 1
是 str1
后一个 char*
位置的内存地址等。但这些地址中的 none,除了 &str1 + 0
,实际上代表任何东西。
如果要查看数组元素的地址,只需写str1 + i
。这意味着“去 str1
点,然后前进 i
个位置。”