单选题
1、第214题 (1.0分) 题号:192 下面选择中正确的赋值语句是(设char a[5],*p=a;)()。
A
p=“abcd”;
B
a=“abcd”;
C
*p=“abcd”;
D
*a=“abcd”;
答案解析
正确答案:A
解析:
这道题考查的是 C 语言中**数组名**、**指针变量**以及**字符串常量**之间的赋值规则。
### 核心概念分析
1. **变量定义**:
* `char a[5]`:定义了一个字符数组 `a`,它包含 5 个字符的空间。在表达式中,数组名 `a` 代表数组首元素的地址,是一个**常量指针**(即地址不可修改)。
* `*p = a`:定义了一个字符指针 `p,并将数组 `a` 的首地址赋值给 `p`。此时 `p` 指向数组 `a` 的第一个元素。`p` 是一个**指针变量**,其值(指向的地址)是可以改变的。
2. **选项逐一解析**:
* **A. `p="abcd";` 【正确】**
* `"abcd"` 是一个字符串常量,它在内存中占据一段空间,并返回该字符串首字符 `'a'` 的地址。
* `p` 是一个指针变量。在 C 语言中,可以将一个地址赋值给指针变量。
* 这条语句的意思是:让指针 `p` 不再指向数组 `a`,而是指向字符串常量 `"abcd"` 的首地址。这是完全合法的语法操作。
* *注意:虽然语法正确,但此时 `p` 与数组 `a` 再无关系。如果题目意图是将字符串拷贝进数组 `a`,则应使用 `strcpy(a, "abcd");`,但仅就“赋值语句”的语法合法性而言,A 是正确的。*
* **B. `a="abcd";` 【错误】**
* `a` 是数组名。在 C 语言中,数组名是一个**地址常量**,不能作为左值被赋值。
* 你不能改变数组 `a` 本身的地址。若要给数组初始化或赋值,必须在定义时初始化(如 `char a[] = "abcd";`)或使用 `strcpy` 等函数拷贝内容。直接赋值是非法的。
* **C. `*p="abcd";` 【错误】**
* `*p` 表示指针 `p` 所指向的**内容**(即一个 `char` 类型的变量)。
* `"abcd"` 是一个字符串常量,其类型是 `char *`(地址)。
* 试图将一个地址(`char *`)赋值给一个字符变量(`char`),类型不匹配。编译器会报错或发出警告(截断指针为字符),这不是正确的赋值方式。
* **D. `*a="abcd";` 【错误】**
* `*a` 等价于 `a[0]`,表示数组第一个元素的值,类型为 `char`。
* 同样,试图将字符串常量的地址(`char *`)赋值给一个字符变量(`char`),类型不匹配,非法。
### 总结
* **数组名**不能直接被赋值(它是常量地址)。
* **指针变量**可以被赋值为某个地址(包括字符串常量的地址)。
* **解引用后的指针/数组元素**(`*p` 或 `*a`)是字符类型,不能直接接收字符串地址。
因此,只有 **A** 选项符合 C 语言的语法规则。
**正确答案:A**
题目纠错
c语言选择判断题库
相关题目
单选题
1、第45题 (1.0分) 题号:531 C语言中,定义结构体的保留字是()。
单选题
1、第44题 (1.0分) 题号:496 double x;scanf( );不可以赋值给x变量的常量是()。
单选题
1、第43题 (1.0分) 题号:669 若用数组名作为函数的实参,传递给形参的是()。
单选题
1、第42题 (1.0分) 题号:518 char a[]=“This is a program.”;输出前5个字符的语句是()。
单选题
1、第41题 (1.0分) 题号:500 下列程序段的输出结果为()。 int x=3,y=2; printf(”%d”,(x-=y,x*=y+8/5));
单选题
1、第40题 (1.0分) 题号:632 以下叙述正确的是()。
单选题
1、第39题 (1.0分) 题号:94 在C语言中,能代表逻辑值”真”的是()。
单选题
1、第38题 (1.0分) 题号:151 以下程序的运行结果是()。
单选题
1、第37题 (1.0分) 题号:693 以下各选项企图说明一种新的类型名,其中正确的是()。
单选题
1、第36题 (1.0分) 题号:509 int a=1,b=2,c=3; if( )a=b; if( )a=c; 则a的值为()。
