C 这段代码的作用是什么?通过索引访问结构?
我目前正在学习LLVM编译器。在他们的语言参考()中,他们给出了一些C代码作为getelementptr指令的示例。但是我不明白这个代码是怎么工作的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]在这里做什么
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
听起来似乎是一个合理的名称