了解 C 中的数组操作指针语法

Oh1*_*123 5 c pointers

我很难理解指针的语法,例如,我有以下代码:

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' 整个过程是什么,我希望得到解释。

Lun*_*din 5

这是混淆:故意编写的代码来混淆。

*arr给出二维数组中的第一项(数组)。在索引 3 处,您会发现's'. 's'- 1 = 的ASCII 码'r'

在 中*arr[2],[] 运算符优先,为您提供二维数组(“和”)中索引 2 处的项目。*给出该数组中第一项(字符)的内容,'a''a'+ 3 = 的ASCII 码'd'

(请注意,符号表值的算术运算不是可移植代码。C 标准仅保证数字 0 到 9 在符号表中相邻放置。)


lve*_*lla 2

我将按照优先顺序分解表达式(*arr)[3] - 1和。*arr[2] + 3

\n\n

表达(*arr)[3] - 1

\n\n
    \n
  • arr\xe2\x86\x92{"It\'s", "wide", "and", "wonderful"}
  • \n
  • (*arr)\xe2\x86\x92"It\'s"
  • \n
  • (*arr)[3]\xe2\x86\x92\'s\'
  • \n
  • (*arr)[3] - 1\xe2\x86\x92\'r\'
  • \n
\n\n

这里请注意两件事:*arr相当于arr[0],并且您可以对 achar执行算术运算,对表示字符的数值进行运算。

\n\n

表达*arr[2] + 3

\n\n
    \n
  • arr\xe2\x86\x92{"It\'s", "wide", "and", "wonderful"}
  • \n
  • arr[2]\xe2\x86\x92"and"
  • \n
  • *arr[2]\xe2\x86\x92\'a\'
  • \n
  • *arr[2] + 3\xe2\x86\x92\'d\'
  • \n
\n\n

这里的消息是arr[]优先于*arr,这就是为什么括号在第一个表达式中很重要。

\n