首页 > 试题广场 >

以下程序段完全正确的是

[单选题]
以下程序段完全正确的是

  • int *p;  scanf("%d", &p);
  • int *p;  scanf("%d", &p);
  • int k, *p=&k;  scanf("%d", &p);
  • int k, *p;  *p=&k;  scanf("%d", &p);
推荐
A不对 P是指针型,scanf中&p应为整型变量空间的地址,而不是整型指针变量空间的地址
B不对 scanf中&P是整型变量空间的地址,但P没有初值,P的值是不确定的 
C正确
D不对 *p=&k 是把k的地址赋值给*p,*p相当于p所指向的变量。这里p没有被赋初值,也就没有指向任何变量,所以使用*p时出错。



编辑于 2015-02-10 15:28:06 回复(8)
OK那么我来解释一下C与D吧

发表于 2022-08-20 08:42:30 回复(0)
A:从能否执行角度看,此代码没有问题,因为执行int *p;时,系统会在栈中为p指针分配内存,此时执行scanf("%d",&p);时,就会将输入值存 入p。从逻辑角度看,此代码就有问题,谁会把整形数据存入到指针中呢?一般都不会这么做;
B:定义了指针,如果不分配空间,即不初始化指针,此时指针指向NULL;
C:定义整形变量k时,系统会自动分配一个内存,这时将指针指向k,然后再向p指向的k写入值是没问题的;
D:*p=&k不对,会提示错误,无法进行编译。
发表于 2016-01-10 22:10:01 回复(10)
b,d中scanf里的双引号格式不对 所有只能在a,c选择,a明显不对
发表于 2017-03-28 15:13:57 回复(10)
定义指针变量时要加上*,给指针变量赋值时不能加*
int k; int *p = &k; 
int k,*p;   p = &k;
发表于 2022-03-01 16:18:44 回复(0)
abd全部都是野指针,没有明确指向一处地址,不能使用。
发表于 2017-09-25 11:43:32 回复(0)
指针变量也是变量。 int x;scanf("%d",&x);这是正确的操作,因为&x的值就是x的地址。 int *x;int y;x=&y;scanf("%d",x);也是正确的操作,因为x是指针变量,其值就是y的地址,但也只有指针变量能这么做(即存储其他变量的地址),如果变成下面这么做就要出问题: int x;int y;x=&y;scanf("%d",x); 因为x不是指针变量,故不能存y的地址,错误出在x=&y这句。 所以也能看出指针的实质,就是一个能存储同类型(比如整型)变量的特殊变量。 而int *x;scanf("%d",x); 和 int x;scanf("%d",x); 会出无法预料的问题,因为x是未经初始化的变量,谁也不知道这个变量的值是多少。
编辑于 2021-01-05 11:42:15 回复(0)
d中,*p=&k的意思是将k的地址赋值给指针p所指向的内容,也就是*p,但是指针p本身是没有初始化的,所以是野指针,因此不对。
发表于 2018-01-04 16:16:16 回复(0)
答案是AC吧
我说说A
int *p;声明了一个指向整型的指针变量,32位机上p是一个占4字节的变量,也就是说它是有内存的,&p表示的是这个4字节变量的地址,可以接受整型输入,而且也不会出错。 只不过这个输入的整型表示的是内存的地址 
发表于 2015-09-29 12:56:03 回复(0)
C的话p已经表示了k的地址,就不需要取地址符的,变成了scanf给指针的地址,是要修改指针指向k地址的值,而不是修改指针自己的地址里的指针值
发表于 2023-10-20 20:15:47 回复(1)
这个题目按照正常人的思路去想的话,这个题目是没有答案的,但是你用异于常人的思想去思考,ABD定义了一个野指针,所以都错了,只能选C
你用一个正常人的思维去思考AB是野指针,写进去就是非法访问,错误,CD中的p被赋值了,指向了K,相当于他是对的吧,但是,后面的scanf把值存到了p把p的地址给改了,这离了个大谱,所以,没办法中的办法就是选C,垃圾牛客
发表于 2021-12-10 23:29:28 回复(1)
指针在初始化时*p代表的时p的地址,初始化后*p代表的就是p指向的对象的值,D选项将*p=&k的*去掉就是正确的了
发表于 2017-12-28 20:55:23 回复(0)
这样最好理解,abd是野指针,指针是辅助变量,必须指向目标才有意义,abd的做法其实就是没有指向目标,后果无法预测,但不非法,只有警告
发表于 2017-10-09 16:41:08 回复(0)
ABD都是操作野指针,C里面p指向k,但你要给k赋值不应该是scanf("%d",p);吗第二个参数应该填k的地址p吧
发表于 2023-04-06 10:04:50 回复(0)
A和B有区别吗一毛一样
发表于 2024-03-08 09:44:29 回复(0)
这题应该出错了吧?
编辑于 2024-02-26 12:30:40 回复(0)
什么傻卵题还 scanf &p 这是要改指针吗,出题的脑袋被门夹了
发表于 2023-11-12 16:20:56 回复(0)
scanf 接受一个地址然后修改这个地址对应的值。 对于d选项,如果想要修改k的值应该传入k的地址也就是指针p的值,这样才能修改k的值。而如果传入&p,则是传入了指针p的地址,等于是要修改p指针的指向。
发表于 2023-08-31 12:56:31 回复(0)

这四个选项中的代码都试图使用 scanf 函数来读取一个整数,但它们的实现方式不同,其中一些是正确的,而另一些是错误的。

选项 A 和 B 的代码是相同的,它们都定义了一个指向 int 类型的指针变量 p,然后使用 scanf 函数试图将读取到的整数存储到指针 p 指向的内存地址中。但是,由于指针 p 没有被初始化,所以它不指向任何有效的内存地址。因此,这两个选项中的代码都是错误的,它们会导致未定义行为。

选项 C 的代码定义了一个 int 类型的变量 k 和一个指向 int 类型的指针变量 p。然后,它将指针 p 初始化为指向变量 k 的地址。接下来,它使用 scanf 函数将读取到的整数存储到指针 p 指向的内存地址中,即变量 k 中。但是,在调用 scanf 函数时,它使用了错误的参数 &p。由于 scanf 函数需要一个指向存储位置的指针作为参数,所以正确的写法应该是 scanf("%d", p);。因此,选项 C 中的代码也是错误的。

选项 D 的代码试图定义一个 int 类型的变量 k 和一个指向 int 类型的指针变量 p。然后,它试图将指针 p 初始化为指向变量 k 的地址。但是,在初始化指针时,它使用了错误的语句 *p=&k;。由于这行代码试图将变量 k 的地址赋值给指针 p 所指向的内存地址中,而不是赋值给指针本身,所以这行代码是错误的。正确的写法应该是 p=&k;。因此,选项 D 中的代码也是错误的。

综上所述,在这四个选项中,没有一个选项能够正确地使用 scanf 函数来读取一个整数。

发表于 2023-08-17 12:28:46 回复(0)
A和B选项不是一样的吗

发表于 2022-11-23 19:31:53 回复(0)
我看着选项有重复
发表于 2022-10-19 19:24:43 回复(0)