我是指点新手......
使用指针为数组赋值时,我们使用:
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));
为什么显示错误?
答案 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是一个指针。