我对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);
我真的不明白,所以请好心地解释一下:)
我搜索了互联网,但我是一个初学者在这方面,不知道究竟如何指针的工作。
2条答案
按热度按时间vybvopom1#
下标运算符
[ … ]
包含一个解引用*
。a[index]
被定义为*(a + index)
,这意味着获取指针a
,计算超过它的index
元素的地址,然后解引用新指针。au9on6nz2#
当索引数组的元素时,实际上不需要解引用数组元素,因为数组元素不是对数组元素的引用,而是数组存储在第一位的值。
到乘法函数,你发送第一个元素的地址,
因为它是一个数组,所以上面的函数调用与
这就已经向乘法函数发送了该数组的第一个地址。
因此,在multiply函数中解引用将导致错误,因为数组索引不存储数组元素的地址,而是存储值。所以你已经对数组元素的值进行了解引用,像index [index]这样的东西是有效的,但反过来就不行了。