C指针使用数组和变量接受值之间的差异?

C指针使用数组和变量接受值之间的差异?,c,arrays,pointers,C,Arrays,Pointers,我不熟悉指针 使用指针为数组赋值时,我们使用: int *arr; arr = malloc(10*sizeof(int)); for(i=0;i<10;i++) { scanf("%d",(arr + i)); } 那么为什么我们不能使用 scanf("%d",*(arr + i)); 为什么显示错误?因为scanf需要指针。没有价值*(arr+i)是该值,因此如果将该值传递给scanf,则函数无法更改该值,从而使其在函数调用后生效 它需要一个指针,以便它可以更改指向的对象的值

我不熟悉指针

使用指针为数组赋值时,我们使用:

int *arr;
arr = malloc(10*sizeof(int));
for(i=0;i<10;i++)
{
   scanf("%d",(arr + i));
}
那么为什么我们不能使用

scanf("%d",*(arr + i));

为什么显示错误?

因为
scanf
需要指针。没有价值
*(arr+i)
是该值,因此如果将该值传递给
scanf
,则函数无法更改该值,从而使其在函数调用后生效

它需要一个指针,以便它可以更改指向的对象的值,并使更改在调用后生效

它类似于
c
中的所有函数调用。它们按价值传递。在函数内部,值可能会更改,但一旦函数返回,任何此类更改都将丢失

但是,如果传递的值是指针的值,则函数可能会更改指针指向的对象的值。当函数返回时,这样的更改仍然有效

一个简单的例子:

void f(int a)
{
    a = 10;  // This change is lost when the function returns
}

void g(int* a)
{
     *a = 10;  // This change will survive when the function returns
}

int main(void)
{
    int a = 0;
    f(a);
    printf("%d\n", a); // will print 0
    g(&a);
    printf("%d\n", a); // will print 10
    return 0;
}

scanf
获取一个值的地址(指针),格式说明符告诉指针的类型

scanf(“%d”,(arr+i))
表示您正在给
scanf
地址
arr
加上偏移量
i

当你写
*arr=10
您也可以将其写成
*(arr+0)=10
因此,您正在取消引用该值并将其赋值为10,换句话说,您不能将其赋给
scanf
,因为它需要一个指针

所以

arr+i是一个范围为0..9的地址,在您编写的数组中反引用一个值
*(a+i)

但是

写入
*ar
r您正在取消引用您分配的一个值

*arr = 10; 

      +---+
arr ->| 10|
      +---+
然而写作

scanf("%d", arr);
可以,因为arr是指向整数的指针,而scanf接受指针。

scanf("%d",(arr + i));
(arr+i)
已经是指向数组的第i个元素的指针
arr
。如果将
scanf
插入“单个”变量,则必须传递其地址(=指向该变量的指针)

为什么会显示错误

取消引用:

scanf("%d",*(arr + i));

这将是错误的,因为它不会传递指向要读取的第i个数组成员的指针,因为
scanf()
需要一个指向格式标记指定的参数的指针,而不是一个值。

我在这里没有看到数组。如果指针是一个数组,它将不会被称为“指针”,而是“数组”(反之亦然)。在上一个scanf示例中,您正在解引用指针,而scanf需要一个地址(指针)。数组可以是一个变量。OP在这里没有使用任何数组。您的问题被弄糊涂了。请参阅并提供一个示例。任何一本好的C语言书都会提供你所没有的完整图片。不要仅仅通过试错和从互联网上的代码片段学习C。@Olaf:“我在这里没有看到数组。”——我看到了。我看到由
malloc
调用创建的匿名数组对象。(当然,
arr
本身是指针对象,而不是数组对象。)
scanf("%d", arr);
scanf("%d",(arr + i));
scanf("%d", &some_int_variable); 
scanf("%d",*(arr + i));