文章目录
- 函数的缺省返回值类型
- 找不同
- 数组指针 + 函数指针
- const 与 指针
- 函数里操作外面传进来的数组
函数的缺省返回值类型
“在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。” 这是初学学 C 语言时有接触到的一个概念,只是有些忘了( int main() 的返回类型也可以省略,编译器不会报错)。
找不同
把简单题想复杂了,strcpy、strncpy 用来字符串拷贝,strcat、strncat 用来字符串拼接,strok 用来分解字符串(将字符串中某字符前的子字符串返回),snprintf 用于将指定内容转换为字符串,同时将字符串拷贝到第一个参数。
数组指针 + 函数指针
- 数组指针格式: *(p)[10]
- 函数指针格式: int (*p)(int *)
将两个组合起来:int (*(*p)[10])(int *)
const 与 指针
太久没接触 const 了,正好复习一下。没有我要选的答案,直接选了 A。分析见后文。
这里借用他人的分析:
一开始我还以为 int *const p 这种写法是错误的。。。同时也没有想到 int const *p 等价于 const int *p 。以前学的全忘光了。
函数里操作外面传进来的数组
先提一点,太久没接触 C 语言,所以有些知识点忘了
出错点:
- 以为数组传入 func 后真发生了偏移(低级错误)
- 把第 6 行的 %c 看成了 %s,这是粗心大意了,加上题目有无法确定选项,所以就没有发现自己错了
先说第一点,数组被传入函数时,传入的是数组首地址,是一个常量,它不能被改变,所以不存在数组首地址发生偏移(在函数外面也不能这样操作,数组名是常量)这一情况,不过正因为传的是地址,所以数组里的成员是可以被改变的(这道题没考这一点)。
第二点,我把 %c 看成了 %s,如果真是 %s,那我应该也是没注意 *s(数组的第一个元素),只能说没认真看题。假如第 6 行是 printf("%s", s);
那么执行后的结果的确无法确定,因为数组 s 的成员里没有字符串结束符 ‘\0’。除非定义时数组长度大于 4,这样编译器会将多余的数组元素赋值为 ‘\0’,或者以字符串形式定义,即 char s[] = "1234"
,这种情况下编译器会认为数组长度为 5。