指向数组的指针与普通指针之差 #包括 #包括 int main() { int*a; int*b=malloc(sizeof(int)*100); scanf(“%d”和“&a”); scanf(“%d”,b); printf(“%d”,a); printf(“%d”,*b); 返回0; }

指向数组的指针与普通指针之差 #包括 #包括 int main() { int*a; int*b=malloc(sizeof(int)*100); scanf(“%d”和“&a”); scanf(“%d”,b); printf(“%d”,a); printf(“%d”,*b); 返回0; },c,pointers,scanf,C,Pointers,Scanf,在这段代码中,为什么指向数组的指针与普通指针相比不需要scanf的地址位置? 对于指向数组的指针的printf,为什么我们必须给出星号而不仅仅是指针变量?虽然printf和scanf的格式说明符语法相似,但它们并不完全相同。尤其是%dforscanf需要int*,因为它需要变量地址来写入,而%dforprintf需要int,因为它只需要一个值来打印 此代码的问题与a和b指向的内容无关,而是与printf和scanf调用中如何使用它们有关 查看每一行: #include <stdio.h&g

在这段代码中,为什么指向数组的指针与普通指针相比不需要scanf的地址位置?
对于指向数组的指针的printf,为什么我们必须给出星号而不仅仅是指针变量?

虽然printf和scanf的格式说明符语法相似,但它们并不完全相同。尤其是
%d
for
scanf
需要
int*
,因为它需要变量地址来写入,而
%d
for
printf
需要
int
,因为它只需要一个值来打印

此代码的问题与
a
b
指向的内容无关,而是与
printf
scanf
调用中如何使用它们有关

查看每一行:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *a;
    int *b= malloc(sizeof(int)*100);
    scanf("%d",&a);
    scanf("%d",b);
    printf("%d",a);
    printf("%d",*b);
    return 0;
}
这是无效的,因为
%d
scanf
的格式说明符需要
int*
但您传递的是
int**

scanf("%d",&a);
printf("%d",a);
这是有效的,因为
b
int*
。它将向数组的第一个元素写入一个
int

scanf("%d",b);
这是无效的,因为
%d
printf
的格式说明符需要
int
,但您传递的是
int*

printf("%d",a);

这是有效的,因为
*b
int
。它将打印数组的第一个元素。

如果您的代码中有输入错误,则只有在使用如下“int a”时,它才会以这种方式工作:

scanf("%d",b);
printf("%d",*b);
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a; // <<< remove * from declaration, such that a is a normal int
    int *b= malloc(sizeof(int)*100);
    scanf("%d",&a);
    scanf("%d",b);
    printf("%d",a);
    printf("%d",*b);
    return 0;
}
在这种情况下,应该很清楚:scanf总是需要一个指针,因此对a使用&address操作符,而不是对已经是指针的b使用&address操作符。对于printf,当a已经是int时,需要取消对b指针的引用

如果你坚持使用“int*a”,你必须写

int a;
int *b= (int *)malloc(sizeof(int)*100);
scanf("%d",&a);
scanf("%d",b);
printf("%d",a);
printf("%d",*b);

正如你所见,指针的处理方式完全相同。但是,*a指针未定义(指向“任何地方”),因此在scanf中使用时可能会崩溃。

在我回答这个问题之前,您的代码中有一个bug需要修复:

int *a;
int *b= (int *)malloc(sizeof(int)*100);
scanf("%d",a);
scanf("%d",b);
printf("%d",*a);
printf("%d",*b);

我们不打算在这里讨论这个问题,因为您不会经常处理指向数组的指针

您可以将上面的
scanf
printf
调用重写为:

int (*b)[N] = malloc( sizeof *b );
下标表达式
a[i]
定义为
*(a+i)
-给定地址
a
,从该地址偏移
i
元素(不是字节!),并取消引用结果


由于隐式解引用操作,表达式
b[0]
的类型为
int
,而不是
int*
,这就是为什么我们在
scanf
调用中需要
&
运算符,而在
printf
调用中不需要
*
运算符的原因

scanf(“%d”,b)已损坏。编辑所以是
scanf(“%d”和&a)。此代码在第8-11行有未定义的行为,因此不清楚您在问什么。此代码中没有数组…@特洛伊木马没有<代码>int b[10]:这里
b
是一个数组<代码>int*b
这里
b
是一个指针,不管它指向哪里。@特洛伊木马
scanf(“%d”,b)未被破坏。这如何回答问题?@Combospirit您是指指针包含的地址,还是指针指向的值?对于后者,您已经使用
b
完成了。对于后者,是否需要先取消引用,然后再打印?或者还有其他方法吗?@Combospirit您需要使用
*
解除对指针的引用,以获取指针指向的值。如果指针指向数组的第一个元素(这是
b
所做的)。您可以使用
b[n]
获取数组元素,其中
n
是数组索引,或者等效地
*(b+n)