AI智能推荐题库-试题通 AI智能整理导入题库-试题通
×
首页 题库中心 c语言选择判断题库 题目详情
CA4E3A01C46000013755684012D01E55
c语言选择判断题库
379
单选题

1、第27题 (1.0分) 题号:199 若有int a[][]={{1,2},{3,4}}; 则*(a+1),*(*a+1)的含义分别为()。

A
 非法,2
B
 &a[1][0],2
C
 &a[0][1],3
D
 a[0][0],4

答案解析

正确答案:B

解析:

这是一道关于 C 语言中二维数组与指针关系的经典题目。我们需要深入理解二维数组在内存中的布局以及指针算术运算的含义。 ### 1. 数组定义与内存布局 首先,看数组的定义: ```c int a[][] = {{1, 2}, {3, 4}}; ``` 这是一个 $2 \times 2$ 的整型二维数组。我们可以将其视为一个包含两个元素的一维数组,每个元素本身又是一个包含两个整数的一维数组。 - `a[0]` 是第一行,内容为 `{1, 2}` - `a[1]` 是第二行,内容为 `{3, 4}` 在内存中,这些元素是连续存放的: `a[0][0]=1`, `a[0][1]=2`, `a[1][0]=3`, `a[1][1]=4` ### 2. 解析 `*(a+1)` * **`a` 的含义**:在表达式中,二维数组名 `a` 代表数组首元素的地址。对于二维数组 `int a[2][2]`,其“首元素”是第一行(即 `a[0]`,类型为 `int [2]`)。因此,`a` 的类型是指向含有2个整数的数组的指针,即 `int (*)[2]`(行指针)。 * **`a+1` 的含义**:指针加法取决于指针指向类型的大小。因为 `a` 指向一行(包含2个 `int`),所以 `a+1` 会跳过整整一行,指向第二行的起始地址。也就是说,`a+1` 等价于 `&a[1]`(第二行的地址)。 * **`*(a+1)` 的含义**:对 `a+1` 进行解引用操作。 * `a+1` 指向第二行 `a[1]`。 * `*(a+1)` 取出该地址处的内容,即第二行这个数组本身 `a[1]`。 * 在 C 语言中,数组名在大多数表达式中会退化为指向其首元素的指针。因此,`a[1]` 等价于 `&a[1][0]`(第二行第一个元素的地址)。 **结论**:`*(a+1)` 的值是第二行第一个元素 `a[1][0]` 的地址,即 `&a[1][0]`。 ### 3. 解析 `*(*a+1)` * **`*a` 的含义**: * `a` 指向第一行 `a[0]`。 * `*a` 等价于 `a[0]`。 * `a[0]` 是第一行数组,它退化为首元素 `a[0][0]` 的地址,即 `&a[0][0]`。此时,`*a` 是一个指向 `int` 的指针 (`int *`)。 * **`*a + 1` 的含义**: * 既然 `*a` 是 `int *` 类型,指向 `a[0][0]`,那么 `*a + 1` 就是向后移动一个 `int` 的位置。 * 它指向第一行的第二个元素,即 `&a[0][1]`。 * **`*(*a+1)` 的含义**: * 对地址 `&a[0][1]` 进行解引用。 * 取出的值就是 `a[0][1]` 的值。 * 根据初始化 `{{1, 2}, ...}`,`a[0][1]` 的值是 **2**。 **结论**:`*(*a+1)` 的值是 **2**。 ### 4. 综合选项分析 * `*(a+1)` 对应 `&a[1][0]` * `*(*a+1)` 对应 `2` 对比选项: A. 非法, 2 B. &a[1][0], 2 C. &a[0][1], 3 D. a[0][0], 4 显然,选项 **B** 符合我们的推导结果。 ### 最终答案 **B**
题目纠错
c语言选择判断题库

扫码进入小程序
随时随地练习

关闭登录弹窗
专为自学备考人员打造
勾选图标
自助导入本地题库
勾选图标
多种刷题考试模式
勾选图标
本地离线答题搜题
勾选图标
扫码考试方便快捷
勾选图标
海量试题每日更新
波浪装饰图
欢迎登录试题通
可以使用以下方式扫码登陆
APP图标
使用APP登录
微信图标
使用微信登录
试题通小程序二维码
联系电话:
400-660-3606
试题通企业微信二维码