C基础:字符类型存储与运算练习及指针理解

需积分: 0 1 下载量 159 浏览量 更新于2024-08-03 收藏 94KB DOCX 举报
今天我们将深入探讨C语言的基础知识,包括字符类型、算术运算、指针概念、数组与指针操作、递归函数以及逻辑表达式的理解。首先,让我们从填空部分开始: 1. **字符型数据与ASCII值**:题目提到char型数据在微机中存储值为0xc0,转换为十进制是192。当使用`printf`以%d打印时,会按照整数方式解析,而0xc0对应的ASCII码是192,所以实际打印值为192,而非65。 2. **类型转换与运算**:`char a=203`,`int b=a`,将字符型数据赋值给整型变量,`int c=a&0xff`,这里执行按位与操作,得到的是字符a的小写字母在ASCII表中的数值(0xff是二进制11111111,小写英文字母的最高位通常为0,所以结果为203)。`b=-53`,`c=203`后,`b`变为负数,`c`保持不变。 3. **内存大小计算**:在Linux 32位系统下,`char str[] = "hello"`,`str`是一个字符数组,存储字符串占用的空间为5个字符加上一个结束符,共6个字节,`sizeof(str)`为1表示可能是因为指针的原因,需要具体上下文。`char *p=str`是一个字符指针,它指向`str`的第一个元素,`sizeof(p)`通常为4,因为它是int类型的指针。`int n=10`,一个基本类型的变量占用4个字节,`sizeof(n)`为4。 4. **逻辑运算符应用**:`int a=1, b=2, c=3, d=4, m=2, n=2;`执行`(m=a>b) && (n=c>d)`,由于a小于b,m为0,所以整个逻辑表达式为假,因此n不会改变,最终`n`的值仍为2。 5. **宏定义和表达式求值**:宏`#define M(x, y, z) x*y+z`,当`a=1`, `b=2`, `c=3`时,代入得`M(a+b, b+c, c+a)`计算结果为`(1+2)*(2+3)+(3+1)`,即18+4,等于22。 接下来是选择题: 6. **指针类型判断**:`int(*p)[3]`是一个指针,指向一个包含3个int元素的一维数组,选项D正确,它不是单个元素的指针,也不是二维数组。 7. **数组和指针算术**:数组`a`的指针`P`指向`a[1]`,即第二个元素(数组下标从0开始),`*++p`表示先递增指针再取值,因此它会先移动到下一个元素,即`a[2]`,其值为30,答案是B。 8. **递归函数计算**:给定的程序段通过递归调用计算`mul`,每次乘以`data+x`的值,初始`mul=1`,经过三次循环后,`data+x`的值分别为`a[2]`(5)、`a[3]`(7)、`a[4]`(9),计算结果依次为5、35、245,最终`mul`的值为245*5=1225,但题目给出的答案是945,这可能是计算错误或者题目有误。 9. **字符数组赋值**:A选项错误,因为`s`是一个字符指针,不能直接赋值字符串,应该使用`strcpy`或`= ...`的方式;B选项正确,`s3`是字符数组,可以正确赋值;C选项是字符数组初始化,合法;D选项`s1`没有指定长度,赋值不明确。 10. **结构体成员访问**:结构`struct student`中的`name`字段使用`.`运算符访问,因此正确方法是`stud.name`,答案是D。 11. **递归函数返回值**:函数`fun`递归终止条件为`x==0`或`x==1`,当`x=7`时,递归进入`fun(5)`,然后`fun(3)`,直到`fun(1)`返回3,此时`p`的值为3,返回到上一层递归,继续执行,最终`p`的值为2,答案是B。 12. **逻辑表达式判断**:`while(!E)`中的`!E`等价于`E==0`的否定,即`E`不为0,所以答案是B。 总结:此篇C基础练习涵盖了字符类型、算术运算、指针、数组操作、递归和逻辑表达式等内容,深入理解和掌握这些知识点对于提高编程技能至关重要。