C 这段代码的作用是什么?通过索引访问结构?

C 这段代码的作用是什么?通过索引访问结构?,c,C,我目前正在学习LLVM编译器。在他们的语言参考()中,他们给出了一些C代码作为getelementptr指令的示例。但是我不明白这个代码是怎么工作的 struct RT { char A; int B[10][20]; char C; }; struct ST { int X; double Y; struct RT Z; }; int *foo(struct ST *s) { return &s[1].Z.B[5][13]; } s[1]在这里做什么

我目前正在学习LLVM编译器。在他们的语言参考()中,他们给出了一些C代码作为getelementptr指令的示例。但是我不明白这个代码是怎么工作的

struct RT {
  char A;
  int B[10][20];
  char C;
};

struct ST {
  int X;
  double Y;
  struct RT Z;
};

int *foo(struct ST *s) {
  return &s[1].Z.B[5][13];
}
s[1]
在这里做什么

它是否使用索引访问结构


它是如何在这里得到元素Z的?

s
的类型是
struct ST*
,是指向
struct ST
的指针。数组和指针在C语言中或多或少是一样的(有一些警告)。因此
s[1]
是一个
struct ST

.Z
访问其中的元素
Z
,即
struct RT
.B
访问该结构中的元素
B
,然后获取该元素的
[5][13]
元素,最后使用
&
返回该元素的地址

它是否使用索引访问结构

否。
struct ST*s
:s是指针,因此它可能指向
ST
类型的某些元素数组


s[1]
获取这样一个数组的第二个元素
s[1]
相当于
(*(s+1))

因为我们有
struct ST*s
,我们也知道s[1]属于
struct ST
类型。它只是将
s
视为指向数组-of-struct-s的第一个元素的指针。

在本例中,任何指针
struct ST*
都可以视为指向数组的指针。通过编写
s[1]
程序员假设
foo
接收至少两个
struct ST
对象的数组。(如果程序员在这一点上出错,则程序具有未定义的行为。)

因此,
s[1]
访问由
s
指向的数组的第二个元素。该元素是一个
struct ST
,因此
.Z
访问其
Z
字段,该字段是一个
struct RT
.B
到达
B
字段的
struct RT
内部,这是一个二维数组,最后
[5][13]
索引该数组中的特定整数

在所有这些操作之后,将对
&
运算符求值,并检索该特定整数的地址,该整数是函数的结果

我不熟悉LLVM的中间表示法,但对于实现索引链和字段访问并返回指针的IR操作符来说,
getelementptr
听起来似乎是一个合理的名称