所以我在 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/