我正在学习一些C代码,只是为了理解,我找到了一个指针,在[]之间有一个索引,就好像它是一个数组(作为“pointeri ");我不明白它是什么意思,或者它是如何工作的。
这是我找到它的代码的一部分:
struct turing_machine_t{
struct linked_list_t*** transitions;
bool* acceptors;
unsigned int max_steps;
unsigned int num_states;
};
void delete_turing_machine(struct turing_machine_t* tm){
int i,j;
for(i = 0; i < tm->num_states; i++){
if(tm->transitions[i] != NULL){
for(j = 0; j < ALPHABET_SIZE; j++){
struct linked_list_t* tl = tm->transitions[i][j];
//after here there are just some free它来自图灵机模拟器,但这并不重要;如果我是对的,转换是一个三重指针,但过渡和过渡是什么意思呢?如果它不是数组,那么这些索引的意义是什么?
发布于 2019-08-01 20:44:39
dr数组的行为类似于指针,您可以对指针使用数组符号。
transition是一个三重指针。这意味着
a pointer to
a pointer to
a pointer to
a `struct linked_list_t`它也可以解释为3D数组,因为这实际上是数组在幕后的工作方式。The following two syntaxes are functionally identical
int a = array[index];
int a = *(array + index);数组略有不同,因为如果它们是在范围内创建的,那么您使用的任何IDE或静态分析工具通常都会跟踪它们的范围,但编译器对它们的处理方式是相同的。这是因为,当您对这样的指针执行算术时,编译器基本上会将index乘以sizeof(*array) (与sizeof(array[0])相同)。
也就是说,array + 1是在为array分配任何内容之后立即指向内存地址的指针。在此之后,array + 2是一个指向内存地址的指针,假设它与array大小相同。array + 3是该地址之后的内存地址,等等。
因此,括号操作基本上是指针算法的语法糖。transitions[i][j]的表达式可以看作是:
transitions是一个具有指针大小的元素的数组。i获取transitions第四个指针大小的元素(即*(transitions + i))的值。pointer_val)本身就是指向指针大小元素数组的指针。j获取pointer_val第四个指针大小的元素的值(即,*(pointer_val + j),或者,longhand,*(*(transitions + i) + j))linked_list_t的指针,我们将其赋值给变量tl。注意,在transitions的定义中有三个星号。我们在这里计算所有这些-前两个在数组索引中,第三个在我们分配的linked_list_t*中。
发布于 2019-08-01 20:42:40
如果指针ptr指向一个连续的对象组,那么ptr[i]将引用该组的i+1th元素,就像如果ptr是一个数组一样。tm->transitions和tm->transitions[i]可能就是这种情况。
https://stackoverflow.com/questions/57316573
复制相似问题