单选题
1、第3题 (1.0分) 题号:187 经过下列的语句 int j,a[10],*p;定义后,下列语句中合法的是()。
A
p=p+2;
B
p=a[5];
C
p=a[2]+2;
D
p=&(j+2);
答案解析
正确答案:A
解析:
**解析:**
首先分析题目中给出的变量定义:
`int j, a[10], *p;`
* `j` 是一个整型变量 (`int`)。
* `a` 是一个包含10个整数的数组 (`int[10]`),数组名 `a` 在表达式中通常代表数组首元素的地址,即 `int*` 类型。
* `p` 是一个指向整型的指针变量 (`int*`)。
接下来逐项分析各个选项的合法性:
**A. `p = p + 2;`**
* **分析**:`p` 是 `int*` 类型的指针。在 C/C++ 语言中,指针可以进行算术运算。`p + 2` 表示将指针 `p` 向后移动 2 个 `int` 类型大小的位置,结果仍然是一个 `int*` 类型的地址。
* **赋值**:将一个 `int*` 类型的值赋给 `int*` 类型的变量 `p`,类型匹配,语法合法。
* **注意**:虽然此时 `p` 尚未初始化(指向未知内存),直接解引用会导致未定义行为,但仅就**语句本身的语法和类型兼容性**而言,该赋值语句是合法的。
**B. `p = a[5];`**
* **分析**:`a[5]` 访问的是数组 `a` 的第 6 个元素,其类型是 `int`(整型数值)。
* **赋值**:试图将一个 `int` 类型的值直接赋给 `int*` 类型的指针变量 `p`。
* **结论**:类型不匹配。在标准 C/C++ 中,不能直接将整数赋给指针(除非使用强制类型转换,如 `p = (int*)a[5];`,但原题没有转换)。因此,该语句**非法**。
**C. `p = a[2] + 2;`**
* **分析**:`a[2]` 是 `int` 类型,`2` 也是 `int` 类型,所以 `a[2] + 2` 的结果是 `int` 类型。
* **赋值**:同样是将 `int` 类型的值赋给 `int*` 类型的指针 `p`。
* **结论**:类型不匹配,该语句**非法**。
**D. `p = &(j + 2);`**
* **分析**:`j + 2` 是一个算术表达式,计算结果是一个临时的整数值(右值,rvalue)。
* **取地址**:C/C++ 规定,只能对**左值**(lvalue,即具有确定内存地址的对象,如变量)使用取地址运算符 `&`。临时计算结果没有固定的内存地址,因此不能对其取地址。
* **结论**:语法错误,该语句**非法**。
**总结:**
只有选项 A 中的指针算术运算和赋值在类型上是完全匹配的,符合 C/C++ 语法规则。
**正确答案:A**
题目纠错
c语言选择判断题库
相关题目
单选题
1、第256题 (1.0分) 题号:547 int (*p)[6]; 它的含义为()。
单选题
1、第255题 (1.0分) 题号:133 若有以下定义:char s='\092'; 则该语句()。
单选题
1、第254题 (1.0分) 题号:186 已知p,p1为指针变量,a为数组名,j为整型变量,下列赋值语句中 不正确的是()。
单选题
1、第253题 (1.0分) 题号:208 下列各m的值中,能使m%3==2&&m%5==3&&m%7==2为真的是()。
单选题
1、第252题 (1.0分) 题号:557 打开文件时,方式”w”决定了对文件进行的操作是()。
单选题
1、第251题 (1.0分) 题号:87 C语言源程序的基本单位是()。
单选题
1、第250题 (1.0分) 题号:709若定义:int a=511,*b=&a;, 则printf(”%d\n”,*b);的输出结果为()。
单选题
1、第249题 (1.0分) 题号:172 在C语言程序中()。
单选题
1、第248题 (1.0分) 题号:682 sizeof( )是()。
单选题
1、第247题 (1.0分) 题号:182 执行下面程序后,输出结果是()。
