提问人:RobertC 提问时间:9/5/2023 最后编辑:mchRobertC 更新时间:9/5/2023 访问量:65
为什么当我尝试取消引用指向数组的指针时出现错误?
Why do I get the error when I try to dereference a pointer to an array?
问:
我在 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);
我真的不明白,所以请提供一些:)
我在互联网上搜索了一下,但我是初学者,不知道指针是如何工作的。
答:
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)
a
index
评论
0赞
RobertC
9/6/2023
非常感谢!你的回答消除了我的困惑。
评论
p = arr;
*arr
pointer[index]
*(pointer + index)
*a[index]
**(a + index)
a[index]
是数组的元素,但是如果你使用 like ,这是什么结果?这是错误的。所以是正确的。int
*a[index]
*5
a[index] * 2