如何解决char *,内存地址和ASCII码之间是什么关系?
当我取消引用* str + i时,为什么我的代码会这样?我知道,如果要尝试逐个打印字符串的每个字符,我会做str [i]而不是* str + i,但是我想看看这里发生了什么。
计算机是否识别出“ A”是第一个字母,找到了“ A”的存储位置,然后在ASCII表中向上移动?似乎在存储字母“ A”的计算机中只有一个位置,我找到了它,然后因为一个字符是一个字节,所以它只是遍历了ASCII的其余部分for循环上的表格。
谢谢!
输入:
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 | \0|
+---+---+---+---+
^
|
+---+
| | str1
+---+
牢记这一点
*str + i
吗?好吧,C将此解释为“给我str
所指向的字符,然后再添加i
。由于str1
指向字符串的第一个字符,因此*str
的值为'A'
。将i
添加到'A'
,然后开始依次浏览字母表中的字符,这就是为什么您看到A
,然后依次是B
和C
等的原因。
另一方面,当你写
&str1 + i
C将此解释为“给我变量str1
的地址,然后向前移i
的位置。”因此,例如,&str1 + 0
是str1
指针的地址,那么&str1 + 1
是char*
后面一个位置的str1
所在的内存地址等等。但是除了&str1 + 0
以外,这些地址都没有代表任何东西。
如果要查看数组元素的地址,只需输入str1 + i
。这意味着“去str1
指向的位置,然后向前i
位置前进。”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。