我很难理解指针的语法,例如,我有以下代码:
void main(void)
{
char arr[][10] = {"It's", "wide", "and", "wonderful"};
printf("%c", (*arr)[3] - 1);
printf("%c", *arr[2] + 3);
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它会打印 'r' 和 'd' 整个过程是什么,我希望得到解释。
这是混淆:故意编写的代码来混淆。
*arr给出二维数组中的第一项(数组)。在索引 3 处,您会发现's'. 's'- 1 = 的ASCII 码'r'。
在 中*arr[2],[] 运算符优先,为您提供二维数组(“和”)中索引 2 处的项目。*给出该数组中第一项(字符)的内容,'a'。'a'+ 3 = 的ASCII 码'd'。
(请注意,符号表值的算术运算不是可移植代码。C 标准仅保证数字 0 到 9 在符号表中相邻放置。)
我将按照优先顺序分解表达式(*arr)[3] - 1和。*arr[2] + 3
表达(*arr)[3] - 1:
arr\xe2\x86\x92{"It\'s", "wide", "and", "wonderful"}(*arr)\xe2\x86\x92"It\'s"(*arr)[3]\xe2\x86\x92\'s\'(*arr)[3] - 1\xe2\x86\x92\'r\'这里请注意两件事:*arr相当于arr[0],并且您可以对 achar执行算术运算,对表示字符的数值进行运算。
表达*arr[2] + 3:
arr\xe2\x86\x92{"It\'s", "wide", "and", "wonderful"}arr[2]\xe2\x86\x92"and"*arr[2]\xe2\x86\x92\'a\'*arr[2] + 3\xe2\x86\x92\'d\'这里的消息是arr[]优先于*arr,这就是为什么括号在第一个表达式中很重要。