C语言中的指针[0]和*指针之间的区别?

时间:2019-01-23 02:07:10

标签: c arrays memory

因此,我在C中将以下数组fib_sequence传递为函数*fib_sequence[]

通过以下方式访问元素时,我的函数出现段错误:

*fib_sequence[i]

但是当我这样做时它会起作用:

fib_sequence[0][i]

我疯了吗?或者这些不相等吗?

这里是整个功能的参考,分配给索引1 时失败。

分段故障功能

void fib(int *fib_sequence[], int count) {
    *fib_sequence = malloc(sizeof(int[count]));

    for (int i = 0; i < count; i++) {
        if (i == 0) {
            *fib_sequence[i] = 0;

        } else if (i == 1) {
            *fib_sequence[i] = 1;

        } else if (i >= 2) {
            *fib_sequence[i] = *fib_sequence[i-2] + *fib_sequence[i-1];
        }
    }
}

工作功能

void fib(int *fib_sequence[], int count) {
    *fib_sequence = malloc(sizeof(int[count]));

    for (int i = 0; i < count; i++) {
        if (i == 0) {
            fib_sequence[0][i] = 0;

        } else if (i == 1) {
            fib_sequence[0][i] = 1;

        } else if (i >= 2) {
            fib_sequence[0][i] = fib_sequence[0][i-2] + fib_sequence[0][i-1];
        }
    }
}

4 个答案:

答案 0 :(得分:3)

它们不是等效的,因为后缀运算符的优先级高于一元运算符。这意味着*fib_sequence[i]实际上是*(fib_sequence[i])。然后,通过您正确理解的*(E)(E)[0]的等效性,该表达式表示(fib_sequence[i])[0],从中可以删除不必要的括号以获得fib_sequence[i][0]

记住后缀与一元/前缀:*E++E&E和其他都是一元运算符。 E(...)E[]E->membE.memb是后缀。

所有一元和后缀都可以合并为一个。将postfix与postfix结合使用时,很明显:它们沿着一个方向,从左侧的根表达式向右侧:E[i]->foo.memb(arg)[blah]。优先级是相同的,并且关联性显然只能从左到右。

将一元合并在一起时,朝相反的方向进行相同的操作:sizeof (T) &*++E。优先级都是相同的,并且关联性是从右到左。所有这些都高于各种二进制运算符。

如果我们将两者放在一起,我们几乎不必思考:

sizeof (T) &*++E[i]->foo.memb(arg)[blah]

一旦我们扫过一元运算符以找到E,优先级情况就是这样:

sizeof (T) &*++ ( E[i]->foo.memb(arg)[blah] )
                ^---------------------------^

后缀分类的优先级都高于一元分类。

后缀的优先级最高, ,后跟一元,然后是其他所有后缀。

答案 1 :(得分:2)

您想知道一元*[]具有不同的“优先级”,并且您的表情

*foo[1]

实际上被解析为

*(foo[1])

您需要在“首选项”上加上括号,以使其正常运行:

(*foo)[1]

请注意:在某些情况下,*p并不等同于p[0],尽管它始终等同于*(p + 0)(请在此处注意指针算法)。

因此,当p[0]是函数指针时,您可能会发现p拒绝编译,因为它不能参与指针算术。对于数据指针,*pp[0]实际上并没有任何区别。

答案 2 :(得分:1)

*pointerpointer[0]在C中完全相同。但这意味着*fib_sequence[i]fib_sequence[i][0]相同,而与{{1} }(除非fib_sequence[0][i]恰好是0)。 C中的后缀运算符都比前缀运算符具有更高的优先级。

答案 3 :(得分:0)

请注意,int *fib[]被解析为int* (fib)[];即int*的无界数组。您可能是说int (*fib)[]:一个指向无界整数数组的指针。进行更改后,您的第一个示例no longer compiles(应按原样),但(*fib_sequence)[i]fib_sequence[0][i]都可以(也应按原样)工作。

但是,*fib_sequence = malloc(sizeof(int[count]))现在是一个错误,因为您无法分配数组值。这意味着您将不得不将malloc移到函数之外,或者放弃int (*fib)[]语法而改为使用int** fib