若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是

A) 若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是
A) i=*p; B) p*=*&j; C) i=&j; D) i=**p; 要与原因

*p=*&j。

int *p=&i已经定义了指针p指向了变量i,也就是p的值是变量i的地址,即*p=i。

i=*p意思是将指针p所指向的值赋予给i,*p=*&j是指将j的值赋予给指针p所指向的值,而指针p指向了变量i,因为就实现将j的值赋予给i; i=&j是指将变量j的地址赋予给i;*p等于变量i了,因此 i=**p就已经不能满足实现i=j。

扩展资料:

特有特点

1、C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。

2、C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。

3、不同的变量类型可以用结构体(struct)组合在一起。

4、只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。

5、部份的变量类型可以转换,例如整型和字符型变量。

6、通过指针(pointer),C语言可以容易的对存储器进行低级控制。

7、预编译处理(preprocessor)让C语言的编译更具有弹性。

参考资料:

百度百科-c语言

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-04

没有正确答案。推测B应改为 B.*p = *&j;

题干分析:在声明中 int i, j=2, *p=&i; 定义了i,j 两个整数型变量,并且j的值为2。后面又定义了一个整数型指针p。只有声明变量里面的*才表示p是一个指针,与后面的*不一样。所以这里的p是一个指针,后面的&i表示取i的地址。于是p就得到了i的地址。p指向i。

所以若要把j赋值给i,有两种方法。一种是直接赋值,另一种是用指向i的p间接赋值。A、C和D都是要直接给i赋值。

A选项:*p是取p的内容,也就是取到了i的值。然而i并没有赋值。没有初始化的i里面的内存可能是其他程序使用过的,里面的东西是随机的。而且把i赋值给i也不对。

B选项:p*=*&j; 语法错误。*=表示要拿左边的东西乘以右边的东西再存入左边。右边的*&j表示先取j的地址,再根据j的地址去到j的内容。等价于j本身。左边是一个指针,因而不能和右边的整数相乘。编译时会发生类型错误。

C选项:把j的地址赋值给i也是不对的。一是类型不匹配,指针不能直接赋值给整数型变量。所以编译会产生未强制类型转换就赋值的警告。二是不符合把j赋值给i的题意。运行后i得到了j的地址,但以整数的格式解读出来,得到的数字是看不出来有什么意义的。

D选项:i=**p; 语法错误,编译无法通过。*p先取到了p的内容,即得到了类型为整数型的i的内容。而*只能对指针操作取出指向指针。*p已经是整数型无法再解引用了(解引用就是取内容)。

假若B改为 B.*p = *&j; 即符合题意。p是指向i的指针。*p解引用后左边就是i。右边是先取了地址再取内容,实际为j。i=j; 用j给i赋值, 满足题意。

第2个回答  2013-07-14
要说这4个语句都错了。。
A) i=*p; (*p)即为i,也就是i=i,错。。
C) i=&j; 将变量j的地址赋给i,错。。
D) i=**p; (*p)是个整型变量i,*(*p)就不知道是什么东西了,语法不对,错。。
B) p*=*&j; 这个选项算是最接近的,改成 *p=*&j; 就是对的。。*p就是i,*&j就是*(&j),也就是j,整个语句就是i=j。。
就是这些吧。。本回答被网友采纳
第3个回答  推荐于2017-06-16
i,j是相互独立的两个变量,p是指向i地址的指针,若要完成i = j;的操作
A) i=*p; //非法操作,有编译错误
B) p*=*&j; // 胡编乱造的语句,无法通过编译
C) i=&j; //将j的地址赋给i,不能完成i = j的操作
D) i=**p; //混乱的赋值操作。
唯一有希望的是,B),若改作*p = *&j;或p = &j;则可以。本回答被网友采纳
相似回答