单选题
1、第122题 (1.0分) 题号:193 具有相同类型的指针变量p与数组a,不能进行的操作是()。
A
p=a;
B
*p=a[0];
C
p=&a[0];
D
p=&a;
答案解析
正确答案:D
解析:
这道题考查的是 C 语言中**指针与数组之间的关系**,特别是指针赋值时的类型匹配问题。
### 核心概念解析
在 C 语言中,假设定义如下:
```c
int a[10]; // 数组 a,包含10个整数
int *p; // 指针 p,指向一个整数
```
我们需要分析数组名 `a` 和取地址操作 `&a` 的区别:
1. **数组名 `a`**:
* 在大多数表达式中,数组名 `a` 会**退化**(decay)为指向数组第一个元素的指针。
* 类型:`int *`(指向 int 的指针)。
* 值:等于 `&a[0]`。
2. **取地址 `&a`**:
* 这是对**整个数组**取地址。
* 类型:`int (*)[10]`(指向包含10个整数的数组的指针,即**数组指针**)。
* 值:虽然数值上通常也等于数组首地址,但**类型不同**。
3. **指针变量 `p`**:
* 类型:`int *`(指向 int 的指针)。
---
### 选项逐一分析
* **A. `p = a;`**
* `a` 退化为 `int *` 类型。
* `p` 是 `int *` 类型。
* **类型匹配**,可以赋值。这是将指针指向数组首元素的常用写法。
* ✅ **合法**
* **B. `*p = a[0];`**
* `a[0]` 是数组的第一个元素,类型为 `int`。
* `*p` 表示指针 p 所指向的内存位置,类型也是 `int`(左值)。
* 这是将一个整数值赋给指针所指向的内存单元。
* **注意**:前提是 `p` 已经初始化并指向合法的内存空间,否则运行时会出错,但从**语法和类型操作**角度看,这是合法的赋值操作(int 赋给 int)。题目问的是“不能进行的操作”,通常指编译错误或类型不匹配,此选项语法正确。
* ✅ **合法**
* **C. `p = &a[0];`**
* `a[0]` 是数组第一个元素。
* `&a[0]` 是第一个元素的地址,类型为 `int *`。
* `p` 是 `int *` 类型。
* **类型匹配**,可以赋值。这与 `p = a;` 等价。
* ✅ **合法**
* **D. `p = &a;`**
* `&a` 的类型是 `int (*)[10]`(数组指针)。
* `p` 的类型是 `int *`(普通指针)。
* **类型不匹配**:一个是“指向数组的指针”,一个是“指向整型的指针”。
* 在标准 C 语言中,这两种指针类型不同,直接赋值会导致**编译警告或错误**(取决于编译器严格程度)。虽然它们的数值可能相同,但语义和步长完全不同(`p+1` 移动 4 字节,`&a+1` 移动 40 字节)。
* ❌ **不合法(类型不兼容)**
---
### 结论
选项 D 中,将“数组指针”赋值给“普通指针”,存在类型不匹配的问题,因此是不能直接进行的操作(除非使用强制类型转换,但题目未提及)。
**正确答案:D**
题目纠错
c语言选择判断题库
相关题目
单选题
1、第137题 (1.0分) 题号:733 以下叙述中不正确的是()。
单选题
1、第136题 (1.0分) 题号:620 下列运算符中优先级最高的是()。
单选题
1、第135题 (1.0分) 题号:499 以下常量中,能够代表逻辑”真”值的常量是()。
单选题
1、第134题 (1.0分) 题号:143 C语言中以下几种运算符的优先次序()的排列是正确的。
单选题
1、第133题 (1.0分) 题号:170 关于return语句,下列正确的说法是()。
单选题
1、第132题 (1.0分) 题号:128若int类型数据占两个字节,则下列语句的输出为()。int k=-1; printf(”%d,%u\n”,k,k);
单选题
1、第131题 (1.0分) 题号:705 若有语句int *point,a=4;和 point=&a;下面均代表地址的一组选项是()。
单选题
1、第130题 (1.0分) 题号:167 下列语句中,不正确的是()。
单选题
1、第129题 (1.0分) 题号:651 以下定义语句中,错误的是()。
单选题
1、第128题 (1.0分) 题号:125 下列程序的输出结果是()。
