【问题标题】:What does it mean putting indexes inside [] parentheses after a pointer? [duplicate]将索引放在指针后面的 [] 括号内是什么意思? [复制]
【发布时间】:2019-08-01 20:29:09
【问题描述】:

我正在研究一些 C 代码只是为了理解,我发现了一个在 [] 之间有索引的指针,就像它是一个数组一样(如“pointer[i]”);我不明白它是什么意思或它是如何工作的

这是我找到它的一段代码:

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

它来自图​​灵机模拟器,但这并不重要; 如果我是正确的,transition 是一个三重指针,但它是什么意思 transition[i] 和 transition[i][j]?如果不是数组,这些索引是什么意思?

【问题讨论】:

标签: c pointers


【解决方案1】:

如果指针ptr 指向一组连续的对象,那么ptr[i] 将引用该组的第i+1 个元素,就像ptr 是一个数组一样。 tm-&gt;transitionstm-&gt;transitions[i] 可能就是这种情况。

【讨论】:

    【解决方案2】:

    tl;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] 可以认为是:

    1. transitions 是一个包含指针大小元素的数组
    2. transitions(即*(transitions + i))获取ith指针大小元素的值
    3. 我们刚刚得到的值(我们称之为pointer_val)本身就是一个指向指针大小元素数组的指针。
    4. pointer_val(即*(pointer_val + j),或简写为*(*(transitions + i) + j))获取jth 指针大小元素的值
    5. 我们刚刚得到的值是一个指向linked_list_t的指针,我们将它赋值给一个变量tl

    注意transitions 的定义中有三个星号。我们在这里考虑了所有这些——前两个在数组索引中,第三个在我们分配的linked_list_t* 中。

    【讨论】:

    • 数组只是变相的指针,即使不是彻头彻尾的谎言,充其量也是一个危险的半真半假。顺便说一句,索引是一种指针操作,而不是数组操作。
    • 索引操作符是指针算术结合解引用结果的完全语法糖。这就是它的定义。当一个操作数恰好指定一个数组时,将应用正常的自动转换为指针。
    • @wattbatt 不是真的,因为那是一个定义而不是一个访问。与其说“这是一个指向指针的指针”,不如说是提前定义了所有内容的所有大小。这主要影响分配内存的时间和方式(因为现在transitions 是一个与ALPHABET_SIZE * something * sizeof(struct linked_list_t) 完全相同的内存块数组。指针算术说明了这一点,因此最终使用情况相同。但是内存分配完全不同,这会影响代码的其他部分。
    • @GreenCloakGuy:数组不是伪装的指针 - 数组 expressions 会根据需要转换(“衰减”)为指针表达式。下标运算符a[i]是根据指针操作定义的——*(a + i),只是如果a是数组类型的表达式,则转换为指针类型(值是第一个元素的地址)在计算较大的表达式之前。
    • @GreenCloakGuy 数组是由一系列元素组成的对象,而指针只是一个值,它指向另一个值的位置。当然,指针可以指向数组中的元素,但数组和指针几乎不是一回事,或者正如您所说的那样,“数组只是变相的指针”。经常会出现混淆,因为当您按名称引用数组时,在大多数(但不是全部)上下文中都会隐式转换为指针(指向第一个元素)。这并不意味着数组指针!
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2016-12-15
    相关资源
    最近更新 更多