单选题
1、第116题 (1.0分) 题号:707 若有说明:int *p1,*p2,m=5,n;以下均是正确赋值语句的选项是()。
A
p1=&m;p2=&p1
B
p1=&m;p2=&n;*p1=*p2;
C
p1=&m;p2=p1;
D
p1=&m;*p2=*p1;
答案解析
正确答案:C
解析:
**正确答案:C**
**解析:**
首先分析题目中定义的变量:
* `int *p1, *p2`:定义了两个指向整型数据的指针变量 `p1` 和 `p2`。
* `int m=5, n`:定义了两个整型变量 `m`(初始化为5)和 `n`(未初始化)。
接下来逐项分析各选项的正确性:
* **A. `p1=&m; p2=&p1;`**
* `p1=&m;` 是正确的,将 `m` 的地址赋给指针 `p1`。
* `p2=&p1;` 是**错误**的。`p1` 本身是一个指针变量(类型为 `int *`),`&p1` 获取的是指针变量 `p1` 自身的地址,其类型应为二级指针(`int **`)。而 `p2` 定义为一级指针(`int *`),类型不匹配,不能直接赋值。
* **B. `p1=&m; p2=&n; *p1=*p2;`**
* `p1=&m;` 正确。
* `p2=&n;` 正确,将 `n` 的地址赋给 `p2`。
* `*p1=*p2;` 虽然语法上合法,但存在逻辑风险。变量 `n` 只是声明了但未初始化,其值是未知的(垃圾值)。`*p2` 读取的是 `n` 的值,将其赋给 `*p1`(即 `m`)。虽然这在C语言语法中不算“错误语句”,但在严格的编程规范或某些编译器警告级别下,使用未初始化的变量通常被视为不良实践。不过,更关键的判断依据通常在于D选项的明显错误和C选项的绝对正确性。如果在单选题中寻找“均正确且无隐患”的选项,我们需要对比其他项。让我们先看C和D。
* **C. `p1=&m; p2=p1;`**
* `p1=&m;` 正确,`p1` 指向 `m`。
* `p2=p1;` **正确**。这是指针之间的赋值。它将 `p1` 中存储的地址(即 `m` 的地址)拷贝给 `p2`。执行后,`p1` 和 `p2` 都指向变量 `m`。这是完全合法且常见的指针操作。
* **D. `p1=&m; *p2=*p1;`**
* `p1=&m;` 正确。
* `*p2=*p1;` 是**错误**的(会导致运行时错误/未定义行为)。`p2` 被定义后**没有初始化**,它是一个野指针,指向内存中的随机位置。`*p2` 试图向这个随机地址写入数据(`*p1` 的值,即5),这会导致程序崩溃或不可预知的后果。在使用指针间接引用(解引用)之前,必须确保指针已经指向了一个合法的、已分配的内存地址。
**总结:**
* A 选项类型不匹配。
* D 选项使用了未初始化的野指针,严重错误。
* B 选项使用了未初始化的变量 `n` 的值,虽然语法通过,但不如 C 选项严谨和规范。
* C 选项所有操作均符合语法规则且逻辑安全。
因此,最合适的选项是 **C**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第143题 (1.0分) 题号:184 下列定义不正确的是()。
单选题
1、第142题 (1.0分) 题号:617 执行语句 for(i=1;i++<4;); 后变量 i 的值是()。
单选题
1、第141题 (1.0分) 题号:657 以下不能正确进行字符串赋初值的语句是()。
单选题
1、第140题 (1.0分) 题号:436 设j和k都是int类型,则for循环语句()。 for(j=0,k=0;j<=9&&k!=876;j++) scanf(”%d”,&k);
单选题
1、第139题 (1.0分) 题号:150 经过以下语句定义后,表达式z+=x>y?++x:++y的值为()。 int x=1,y=2,z=3;
单选题
1、第138题 (1.0分) 题号:134 若a是float型变量,b是unsigned型变量,以下输入语句中合法的是()。
单选题
1、第137题 (1.0分) 题号:733 以下叙述中不正确的是()。
单选题
1、第136题 (1.0分) 题号:620 下列运算符中优先级最高的是()。
单选题
1、第135题 (1.0分) 题号:499 以下常量中,能够代表逻辑”真”值的常量是()。
单选题
1、第134题 (1.0分) 题号:143 C语言中以下几种运算符的优先次序()的排列是正确的。
