当前位置: 代码迷 >> C语言 >> 指针
  详细解决方案

指针

热度:608   发布时间:2008-02-22 19:32:50.0
这个题目的答案肯定是A,但B也会经常被用到,而且也合法,只不过不是强类型匹配罢了。我只能说出题的人很无聊。
C语句是错误的,因为申明中p是一个指向char类型变量的指针,而指针是不允许进行乘法运算的,而且加法运算也没有意义(至于能不能进行我没试过,不好说)。
D语句中赋值符两端操作数类型不统一,而且不是兼容类型(如char类型可赋值给int类型,便是兼容类型)。
这道题目的主要是要读懂申明:
char *p,val; >> p是一个指向char类型变量的指针,val是一个char类型变量
从这个申明中可以看到宏定义和typedef的区别:
{
#define CHAR_PTR char*
CHAR_PTR p,val;
}
同上面的申明相同。
{
typedef char* CHAR_PTR;
CHAR_PTR p,val;
}
这个申明中p,val都是指针。
(注:没有初始化不是语法错误,是逻辑错误,是可以允许的)

[[it] 本帖最后由 MooGu 于 2008-2-22 19:35 编辑 [/it]]
----------------解决方案--------------------------------------------------------
A 和 B 确实可以通过编译。

但是 p 指向的位置是随机的。
----------------解决方案--------------------------------------------------------
char *p,val;
A:val=*p; //p指向的空间不确定,可能造成非法读取
B:*p=10;  //p指向的空间不确定,可能造成非法写入
C:p=3*p+1; //指针的乘法无意义
D:val=p;  //类型不匹配

如果题目参照的编译器是TC的话,B是正确的,如果是考试的时候,就写无正确选项并把所有答案错的理由写在选项后面,或者当堂把老师叫过来质疑。
----------------解决方案--------------------------------------------------------
如果anyone对我说的有什么异议,可以在标准一点的编译器上编译并运行下面的代码
程序代码:

#include <stdio.h>
int main()
{
    {char *q=NULL;}   
    char *p,val;
    val=*p;
}

运行出错是因为一次读非法。
我们知道编译器为auto变量分配的是栈空间,在超出变量生存周期后自动释放
{char *q=NULL;}的目的就是在p将指向的空间写上一个0,为了保证能看到错误……

[[it] 本帖最后由 leeco 于 2008-2-22 22:30 编辑 [/it]]
----------------解决方案--------------------------------------------------------
更赞成11楼的,选A对
如果内存空间中空闲的地址空间不多的话,会造成系统崩溃的.
而选A的话,只是val被赋予的值是无意义的
----------------解决方案--------------------------------------------------------
在封卷前的那一刻我把A改成了B[bc02]
----------------解决方案--------------------------------------------------------
应该是A吧
A:val=*p是将p所指向的值赋给val
D:val=p中val是字符型 而p是指针变量
----------------解决方案--------------------------------------------------------
  相关解决方案