指向数组的指针与普通指针之差 #包括 #包括 int main() { int*a; int*b=malloc(sizeof(int)*100); scanf(“%d”和“&a”); scanf(“%d”,b); printf(“%d”,a); printf(“%d”,*b); 返回0; }
在这段代码中,为什么指向数组的指针与普通指针相比不需要scanf的地址位置?指向数组的指针与普通指针之差 #包括 #包括 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
对于指向数组的指针的printf,为什么我们必须给出星号而不仅仅是指针变量?虽然printf和scanf的格式说明符语法相似,但它们并不完全相同。尤其是
%d
forscanf
需要int*
,因为它需要变量地址来写入,而%d
forprintf
需要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)
。