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

时间:2016-07-18 19:25:23

标签: c arrays pointers

我是指点新手......

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

int *arr;
arr = malloc(10*sizeof(int));
for(i=0;i<10;i++)
{
   scanf("%d",(arr + i));
}

但是在分配给变量时我们使用

int *arr = malloc(sizeof(int));
*arr = 10;

为什么我们不能使用,

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

为什么显示错误?

3 个答案:

答案 0 :(得分:2)

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

(arr + i)已经是数组arr的第i个元素的指针。如果你scanf进入了一个&#34;单身&#34;变量,你必须传递它的地址(=指向该变量的指针)。

scanf("%d", &some_int_variable); 
  

为什么显示错误?

解引用:

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

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

答案 1 :(得分:0)

因为dplyr::select需要指针。不是价值。 scanf是值,因此如果您将其传递给*(arr+i),则函数无法更改该值,以便在函数调用后生效。

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

就像scanf中的所有函数调用一样。他们通过价值。在函数内部,值可能会更改,但只要函数返回,任何此类更改都将丢失。

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

一个简单的例子:

c

答案 2 :(得分:0)

scanf获取值的地址(指针),格式说明符指示什么类型的指针。

scanf("%d", (arr + i) )表示您提供scanf地址arr加偏移i

当您撰写*arr = 10;时,您也可以将其写为*(arr + 0) = 10;,这样您就可以取消引用该值并将其分配10,换句话说,您无法将其提供给scanf,因为它需要指针。

所以

arr = malloc(10*sizeof(int));

      +---+---+---+---+---+---+---+---+---+---+
arr ->|0  |   |   |   |   |   |   |   |   | 9 |
      +---+---+---+---+---+---+---+---+---+---+

arr + i是0..9范围内的地址,取消引用您编写的数组中的值*(a+i)

但是

arr = malloc(sizeof(int));

      +---+
arr ->|   |
      +---+

*ar r你要取消引用你分配的一个值

*arr = 10; 

      +---+
arr ->| 10|
      +---+

然而写作

scanf("%d", arr);

很好,因为arr是一个指向整数的指针,而scanf是一个指针。