我的 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);
我不太明白,所以请解释一下:)
我在互联网上搜索过,但我是这方面的初学者,不知道指针到底是如何工作的。
在索引数组元素时,实际上不需要取消引用数组元素,因为数组元素不是对数组元素的引用,而是对数组首先存储的值。
将第一个元素的地址发送到乘法函数
multiply(&arr[0], 5)
由于是数组,所以上面的函数调用与
相同multiply(arr, 5)
这已经向乘法函数发送了 arr 数组的首地址。
因此,在乘法函数内部取消引用将导致错误,因为数组索引不存储数组元素的地址,而是存储值。 所以你一直在对数组元素的值进行取消引用,像 arr[index] 这样的东西是有效的,但反之则不然。