c - C 中 pointer[0] 和 *pointer 的区别?

标签 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];
        }
    }
}

最佳答案

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

记住后缀与一元/前缀:*E++E&E 和其他都是一元运算符。 E(...), E[], E->memb, E.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] )
                ^---------------------------^

后缀 cruft all 的优先级高于一元 cruft。

后缀具有最高的优先级,其次是一元,然后是其他一切。

关于c - C 中 pointer[0] 和 *pointer 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54319082/

相关文章:

c - 动态分配 'sizeof(char)' 冗余时是否使用 'char'?

c - 我读过 The C Programming Language 我从这里去哪里?

arrays - MongoDB:如何更新数组中的单个子元素,由数组中的索引引用?

java - G1 GC 巨大对象分配

java - "java.lang.OutOfMemoryError: Java heap space"到底是什么?我该如何增加 Java 的内存?

c++ - 问题 : String writes over another string

c - goto后栈的状态

c - 向 int 字符串添加前缀

c++ - 移动数组中的元素

java - 使用较小的物理内存对 10 亿个整数进行排序