提升C/C++指针理解与面试技巧:经典练习题集

需积分: 17 1 下载量 200 浏览量 更新于2024-09-06 收藏 42KB DOC 举报
在C和C++编程语言中,指针是核心概念之一,它们允许程序员直接操作内存地址和数据。以下是一些关于指针的练习题及其解析,旨在帮助你深入理解指针并提高面试表现。 1. 选择题: - (a) 对于数组`inta[5]`和指针`p=a`,表达式`(a)*&a[5]`实际上是错误的,因为`*(a+5)`才是元素`a[5]`的地址。正确答案应是`(a+2)`,因为它表示数组中的第三个元素。 - (b) 数组`inta[2][3]`的第i行j列元素地址可以通过`*(a+i)+j`来获取,因为`a+i`给出的是行指针,加`j`得到列的偏移。所以正确选项是`(a+i)+j`。 - (c) 在`inta[10],*p=a`的定义中,`p+5`表示指针`p`向后移动五个位置,即指向`a[6]`的地址,而不是它的值。因此,正确答案是`元素a[6]的地址`。 - (d) `char*s="abcde";s+=2;printf("%d",s);`这里`s`实际上是指向字符串常量的指针,`s+=2`将`s`移到下一个字符,即指向`c`,`printf`打印的是字符`c`的地址,不是字符`c`本身,所以输出结果是字符`c`的地址,选`字符'c'的地址`。 - (e) 在指针赋值时,不能直接进行算术运算或指针间的赋值,如`c=*p1+*p2`和`c=*p1*(*p2)`都是错误的。`p2=cc)`是将`c`的值赋给`p2`,也是不正确的。正确做法通常是间接访问或解引用操作。 - (f) `char str[20]; char *p;`是正确的数组和指针声明,但是`scanf`的第二个例子中,不能直接用`%s`读取子串,因为`str[2]`和`p[2]`是数组元素的地址,不是有效的输入格式。正确做法是先初始化指针,再进行输入。 - (g) 在`char a[]="Itismine"; char *p="Itismine";`中,`a+1`表示`t`字符的地址是正确的。选项B错误是因为`p`指向字符串时,其长度受字符串本身长度决定,不会因为指针值改变而改变。`p`的地址值不可变,选项C错误。`a`作为数组有长度限制,选项D错误。 - (h) 在`strcmp`的例子中,`s1`和`s2`都进行了偏移,然后比较两个修改后的子串,由于`s1`和`s2`的偏移相同,所以`strcmp`会返回零,表示相等。因此,结果是`零`。 这些题目涵盖了指针的基本概念、数组和指针的结合、内存操作、输入输出和字符串处理,以及指针和数组的注意事项。熟练掌握这些知识点,有助于你在实际编程和面试中更好地运用指针技巧。