为什么当我尝试取消引用指向数组的指针时出现错误?

Why do I get the error when I try to dereference a pointer to an array?

提问人:RobertC 提问时间:9/5/2023 最后编辑:mchRobertC 更新时间:9/5/2023 访问量:65

问:

我在 C 方面非常基础,我不理解这些代码中的某些内容。在第一段代码中,我声明了一个名为 arr 的数组,其中包含预定义的值,并且我还声明了一个名为 p 的 int 类型的指针。之后,我指向 arr 的第一个元素,并将值打印到 p 指向的内容。到目前为止,一切都明白了。

#include <stdio.h>

int main(void)
{
    int arr[5] = {10, 20, 30, 40, 50};
    int *p;

    p = &arr[0];  

    printf("%d\n", *p); // prints 10
}

但是我想使用这个函数,困扰我的是我是否需要取消引用指针 a?我必须写还是?如果我写第二个案例,我会得到一个错误。a[index] * 2*a[index] * 2

void multiply(int *a, int length)
{
    for (int index = 0; index < length; index++)
        printf("%d\n", a[index] * 2);
}

错误:

error: invalid type argument of unary ‘*’ (have ‘int’)
    6 |         printf("%d\n", *a[index] * 2);

我真的不明白,所以请提供一些:)

我在互联网上搜索了一下,但我是初学者,不知道指针是如何工作的。

数组 C 指针 错误处理 取消引用

评论

0赞 Aconcagua 9/5/2023
注意:您可以将数组直接分配给指针,您不需要通过其第一个元素进行间接操作: – 然后数组会自动衰减为指针(在任何需要指针的上下文中都这样做,例如,您也可以获取 via 的第一个元素)。p = arr;*arr
0赞 Aconcagua 9/5/2023
您可能要记住,这是数组的简写(或数组的简写)——应用它应该清楚地说明它失败的原因(这里):......pointer[index]*(pointer + index)*a[index]**(a + index)
0赞 John Bollinger 9/5/2023
错误消息显示它抱怨的代码与问题中显示的代码不同。也许你应该考虑一下这种差异......
0赞 Tom 9/5/2023
a[index]是数组的元素,但是如果你使用 like ,这是什么结果?这是错误的。所以是正确的。int*a[index]*5a[index] * 2

答:

2赞 persona 9/5/2023 #1

在为数组的元素编制索引时,实际上不需要取消引用数组元素,因为数组元素不是对数组元素的引用,而是数组首先存储的值。

要乘法函数,您将第一个元素的地址发送为

multiply(&arr[0], 5)

由于它是一个数组,因此上面的函数调用与

multiply(arr, 5)

这将已经向乘法函数发送 arr 数组的第一个地址。

因此,在乘法函数内部取消引用将导致错误,因为数组索引不存储数组元素的地址,而是存储值。 因此,您一直在取消引用数组元素的值,例如 arr[index] 是有效的,但反之则不然。

3赞 Eric Postpischil 9/5/2023 #2

下标运算符 包括 取消引用 。[ … ]*

a[index]定义为 ,表示获取指针,计算超出指针的元素的地址,然后取消引用该新指针。*(a + index)aindex

评论

0赞 RobertC 9/6/2023
非常感谢!你的回答消除了我的困惑。