在C语言中,指向整型指针数组的指针

3

我在访问指针数组中的元素时有些困惑。假设我有一个指向大小为n的int指针数组的指针int **score_cards。我想要找到数组元素所指向的整数之和。

我考虑过以下方法:

int sum = 0;
int i;
for(i = 0;i<n;i++){
    sum = sum + *(*score_card+ i);
}

但这是错误的,而以下是正确的:

int sum = 0;
int i;
for(i = 0;i<n;i++){
    sum = sum + *(*(score_card + i));
}

现在,我有两个问题。由于*score_cards指向数组的第一个元素,那么第i个元素不是*score_cards + i吗?即第一个元素的地址加上i?另外,为什么我们要将i增加1,而不是sizeof(*int)?
谢谢!

1
为什么要避免索引表达式?请记住,a[b]被定义为等于*(a + b) - fuz
我知道使用下标更清晰,但我想理解指针。 - cuziluvtosmile
3个回答

5
请记住,速记语法a[b]等同于*(a + b),并且完全相等。您不应使用后者,因为它有点难以辨认。

因为*score_cards指向数组的第一个元素

那是不正确的。score_cards指向数组的第一个元素,*score_cards是数组的第一个元素。因此,数组的第i个元素是*(score_cards+i)或者等效的score_cards[i]

另外,为什么我们要将i递增1,而不是递增sizeof(*int)?

在C中,将整数添加到指针时,该整数会隐式乘以所指向类型的大小。这是为了当a是某种类型的对象数组时,a [i]是该数组的第i个元素。

@NidhiKantak 很高兴为您服务。 - fuz

2

score_cards指向数组的第一个元素,*score_cards是数组的第一个元素。

指针算术可以识别大小,因此不需要按类型大小进行缩放。


1
*score_card并不指向数组的第一个元素,它是数组的第一个元素。因此,*score_card + 5将是数组的第一个元素加上五,而不是数组的第六个元素。
当您将数字添加到指针时,编译器会自动将数字乘以所指向的内容的大小。因此,score_card + i实际上意味着score_card + i*sizeof(*score_card)。(当然,如果您在程序中写了这个,它最终会像score_card + i*sizeof(*score_card)*sizeof(*score_card)一样运行,这不是您想要的)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接