全部都是错的,这一点是完全可以肯定的。
对于(1)我们首先要了解,指针变量在被赋予一个确定的地址时,是一个不确定的值,也就是说它可以指向任意的位置。那么int *p, *q; q = p;就是错误的,因为p, q都没有确定的地址值。int a, *p, *q, p = q = &a;是也是错误的,因为int a, *p, *q是声明语句,而p = q = &a是赋值语句,它们是不能在同一条语句中的。
对于(2)我们需要知道非地址值是不能赋值给一个指针变量的,其实也就是不同类型的变量不兼容而已,因为C语言是强制类型语言。那么int a, *p, *q; q = &a; p = *q;就是错误的,因为p是指针类型变量,而*q是int类型值。int a = 20, *p; *p = a; 是正确的。
对于(3)我们需要知道指针变量在赋予一个确定的地址时,是不确定它指向的地址的,也就是说我们无法定位这个变量,也就使用这个变量,和(1)类似的问题。那么int a = 20, *p, *q = &a; *p = *q;就是错误的,因为在 *p = *q;中p没有被赋予一个确定值,那么q就没有确定的指向,于是对q进行取值运算是一个错误的表达。int a = b = 0, *p; p = &a; *p = *q;是正确的,此时需假定q是一个事先声明且被赋予确定值的指针变量。
对于(4)我认为是正确的。首先int a = 20, *p, *q = &a; p = q;中声明了一个int 型变量a和一个指向int型变量的指针p,另一个指向int型的变量q,并将a的地址赋给q。然后是一条赋值语句,将q所指向的变量的地址,也即a的地址赋值给p。对于int p, *q; q = &p;首先声明一个int型变量,和一个指向int型变量的指针,然后是一个声明语句将p的地址赋给指针q。所以我认为答案是错误的。
如果我的解答有任何漏洞,还望多多指教!
楼上说的不对,变量声明了当然是可以取地址的,是可以用&的,
(1)是错的是因为int a,*p,*q,p=q=&a;
p=q=&a前面是个逗号,也就是说,先声明int *p, 后面又声明 int p, 也就是将变量p声明了两次不同类型,所以是不对的,
(4)是对的,所以选D
好吧,我说的楼上楼上。。。。
选项(1)中"int a,*p,*q,p=q=&a;"中的"int a,*p,*q"和"p=q=&a;"之间是逗号,而不是分号,所以是错的
(1)里的a,只是一个变量,是没有地址的,因而不能使用&。(4)那儿同理。