C语言 当我尝试解引用一个指向数组的指针时,为什么会出现错误?

5sxhfpxr  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(134)

我对C语言的理解很简单,但我不理解沿着这些代码的一些东西。在第一段代码中,我声明了一个具有预定义值的数组,名为px,我还声明了一个名为p的int类型指针。之后我指向了p的第一个元素,然后我把值打印到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);

我真的不明白,所以请好心地解释一下:)
我搜索了互联网,但我是一个初学者在这方面,不知道究竟如何指针的工作。

vybvopom

vybvopom1#

下标运算符[ … ]包含一个解引用*
a[index]被定义为*(a + index),这意味着获取指针a,计算超过它的index元素的地址,然后解引用新指针。

au9on6nz

au9on6nz2#

当索引数组的元素时,实际上不需要解引用数组元素,因为数组元素不是对数组元素的引用,而是数组存储在第一位的值。
到乘法函数,你发送第一个元素的地址,

multiply(&arr[0], 5)

因为它是一个数组,所以上面的函数调用与

multiply(arr, 5)

这就已经向乘法函数发送了该数组的第一个地址。
因此,在multiply函数中解引用将导致错误,因为数组索引不存储数组元素的地址,而是存储值。所以你已经对数组元素的值进行了解引用,像index [index]这样的东西是有效的,但反过来就不行了。

相关问题