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

问题描述 投票:0回答:1

我的 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);

我不太明白,所以请解释一下:)

我在互联网上搜索过,但我是这方面的初学者,不知道指针到底是如何工作的。

arrays c pointers error-handling dereference
1个回答
0
投票

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

将第一个元素的地址发送到乘法函数

multiply(&arr[0], 5)

由于是数组,所以上面的函数调用与

相同
multiply(arr, 5)

这已经向乘法函数发送了 arr 数组的首地址。

因此,在乘法函数内部取消引用将导致错误,因为数组索引不存储数组元素的地址,而是存储值。 所以你一直在对数组元素的值进行取消引用,像 arr[index] 这样的东西是有效的,但反之则不然。

© www.soinside.com 2019 - 2024. All rights reserved.