推荐答案
测试一下
题目
设int n=2, *p=&n, *q=p; 则以下赋值语句为非法的是( )。
A *p=*q B n=*q C p=n D p=q
参考答案与知识点
参考答案
【正确选项】C
【解析】
给定定义:`int n=2, *p=&n, *q=p;`,其中 `n` 是整型变量,`p` 和 `q` 均为指向整型的指针,且 `p` 初始指向 `n`,`q` 初始指向 `p` 所指向的对象(即 `n`)。
逐一分析各赋值语句:
- **A:`*p=*q;`** —— 将 `q` 所指向的对象的值(即 `n` 的值 2)赋给 `p` 所指向的对象(即 `n`),相当于 `n = n`,类型一致,合法。
- **B:`n=*q;`** —— 将 `q` 所指向的对象的值赋给整型变量 `n`,类型匹配(`int = int`),合法。
- **C:`p=n;`** —— 将整型变量 `n` 的值(2)直接赋给指针变量 `p`,类型不匹配(指针不能隐式转换为整型,反之亦然)。在 C/C++ 中,除非进行强制类型转换(如 `p = (int*)n`),否则此类赋值属于语法错误,故**非法**。
- **D:`p=q;`** —— 将指针 `q` 的值(即 `n` 的地址)赋给指针 `p`,两者同为 `int*` 类型,完全合法。
因此,非法语句为 `p=n`,即选项 C。
【易错点】
- 混淆指针与整型的赋值规则:指针变量只能存放地址(或 `NULL`),不能直接存放普通整型数值;反之,整型变量也不能直接存放地址(除非使用强制转换,但在此题语境下未作声明)。
- 错误理解 `p=q` 的含义:它使 `p` 与 `q` 指向同一对象,与 `*p=*q` 不同(后者修改的是对象的值,而非指针自身)。
涉及知识点
- 指针与整型的类型匹配
- 指针赋值规则
- 间接访问与解引用操作
- 指针变量的初始化和赋值