单选题
1、第276题 (1.0分) 题号:706 若有说明:int *p,m=5,n;以下正确的程序段是()。
A
p=&n;scanf(”%d”,&p);
B
p=&n;scanf(”%d”,*p)
C
scanf(”%d”,&n);*p=n;
D
p=&n;*p=m;
答案解析
正确答案:D
解析:
这道题主要考察 C 语言中**指针的定义、初始化以及通过指针间接访问变量**的基本规则。我们需要逐一分析每个选项,找出语法正确且逻辑安全的程序段。
**已知条件:**
`int *p, m=5, n;`
- `p` 是一个指向整型的指针变量,目前未初始化(野指针)。
- `m` 是一个整型变量,初始值为 5。
- `n` 是一个整型变量,未初始化。
**选项分析:**
* **A. `p=&n; scanf("%d", &p);`**
* `p=&n;`:将 `n` 的地址赋给指针 `p`,这是合法的,此时 `p` 指向 `n`。
* `scanf("%d", &p);`:`scanf` 需要接收一个地址来存储输入的数据。这里传入的是 `&p`,即**指针变量 p 本身的地址**。虽然语法上可能不报错(取决于编译器对类型匹配的严格程度,通常 `%d` 期望 `int*` 而 `&p` 是 `int**`,类型不匹配),但逻辑上是错误的。题目意图通常是给 `n` 赋值,应该传入 `p` 或者 `&n`。如果目的是给 `n` 赋值,这里写错了;如果目的是给指针 `p` 赋值(改变指向),格式符也不对。更重要的是,在标准 C 中,`%d` 对应 `int*`,传入 `int**` 会导致未定义行为或警告。因此该选项不正确。
* **B. `p=&n; scanf("%d", *p)`**
* `p=&n;`:合法,`p` 指向 `n`。
* `scanf("%d", *p);`:`*p` 表示取出指针 `p` 指向的值(即变量 `n` 的值)。`scanf` 的第二个参数必须是一个**地址**(指针),而 `*p` 是一个 `int` 类型的值。将整数值当作地址传入 `scanf` 会导致程序运行时崩溃(段错误),因为程序会尝试向内存地址为 `n` 的值的位置写入数据,这通常是非法的。因此该选项错误。
* **C. `scanf("%d", &n); *p=n;`**
* `scanf("%d", &n);`:合法,从键盘读取一个整数存入 `n`。
* `*p=n;`:此时试图通过指针 `p` 访问内存。但是,在此之前**并没有对指针 `p` 进行初始化**(即没有让 `p` 指向任何有效的内存地址)。`p` 是一个野指针,其值是随机的。对野指针进行解引用赋值(`*p = ...`)是极其危险的操作,会导致未定义行为,通常会引发程序崩溃。因此该选项错误。
* **D. `p=&n; *p=m;`**
* `p=&n;`:将变量 `n` 的地址赋给指针 `p`。此时 `p` 合法地指向了 `n`。
* `*p=m;`:`*p` 代表指针 `p` 所指向的变量,也就是 `n`。这条语句等价于 `n = m;`。由于 `m` 的值为 5,执行后 `n` 的值也变为 5。
* 整个过程指针先初始化后使用,逻辑正确,语法合法。
**结论:**
只有选项 D 正确地初始化了指针,并安全地通过指针进行了赋值操作。
**正确答案:D**
题目纠错
c语言选择判断题库
相关题目
单选题
1、〖第23题〗647) 以下能对二维数组a进行正确初始化的语句是()。
单选题
1、〖第22题〗06) 以下叙述中不正确的是()。
单选题
1、〖第21题〗433) 下列程序的输出为()。 main() { int y=10; while(y--) ; printf(”y=%d\n”,y); }
单选题
1、〖第20题〗453) 以下函数调用语句中实参的个数是()。 exce((v1,v2),(v3,v4,v5),v6);
单选题
1、〖第19题〗655) 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,
单选题
1、〖第18题〗378) 下列字符序列中,不可用作C语言标识符的是()。
单选题
1、〖第17题〗635) 若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是()。
单选题
1、〖第16题〗720) 函数 rewind 的作用是()。
单选题
1、〖第15题〗692) 以下叙述中正确的是()。
单选题
1、〖第14题〗35) 已知字母a的ASCII十进制代码为97,则执行下列语句后的输出结果为()。 char a='a'; a--; printf(”%d,%c\n”,a+'2'-'0',a+'3'-'0');
