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语言的编译更具有弹性。
参考资料:
没有正确答案。推测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赋值, 满足题意。