C语言考前查漏补缺=W=
首先会将自己遇到的问题列出来,然后综合起一个模块一起回答=W=
一、C语言函数的基本知识
1.对于函数的理解:C语言中,函数可以没有形式参数么?
2.函数的缺省返回类型为什么形?
3.函数在命名时,形式参数,局部变量,外部参数的同名问题
4.静态变量的真正用法和含义
5.关于return语句的理解
6.一个实例,用于说明其关系。
问题的回答
变量类型 | 定义位置 | 作用域 | 储存位置 | 解释说明 |
---|---|---|---|---|
全局变量 | 函数体外 | 定义点起到整个程序结束 | 静态储存区 | 生命周期为整个运行期间,static类型全局变量仅限本文件使用,非static可用extern声明后使用 |
静态局部变量 | 函数体内 | 所在函数语句块内部 | 静态储存区 | 定义时使用关键字static,生命周期为程序的的整个运行期间 |
自动局部变量 | 函数体内 | 所在函数语句块内部 | 动态数据区 | 定义时使用关键字auto(可省略),周期为函数(或者语句块)的执行期间。 |
寄存器变量 | 函数体内 | 所在函数语句块内部 | CPU通用寄存器 | 定义时使用关键字register,现很少使用 |
A1:
C语言中,函数当然可以没有形式参数,但是函数在定义时是平等的,既函数不可以嵌套定义,如果函数的返回参数缺省,那么自动填补成int。
A2:
函数的返回参数值缺省,自动填补成int形。
A3:
1.局部变量的作用域仅仅在本函数或者语句块,所以不同函数中可以出现相同名字的局部变量。
2.形式参数作为局部变量的一种,其作用域在该函数(语句块中),其本身就是调用主函数中的局部变量,或者全局变量,故两者本身不在同一段作用域中,因此,形式参数可以与对应的实在参数变量同名
eg:#include <stdio.h>
int fun(int x)
{ printf("%d",x);
return 0;}
int main()
int x;
scanf("%d",&x);
fun(x);
return 0;
}//其是合理且正确的
3.外部变量是在函数外部定义的变量,与局部变量可以同名,只不过在同名局部变量所在的作用域内部该全局变量将不再起作用。
4.形式参数不能与局部变量同名,因为局部变量与函数(语句块)的形式参数在同一段作用域,其相互影响,产生变量歧义。
A4:(借鉴大佬博客)
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。
通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量有以下特点:
1.该变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
4.它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
啊
A5:
return语句一般与函数的返回值有关系,不妨将其分成void型和非void型两大类进行讨论总结
1.对于void型:其可以没有return语句,函数执行到函数体的结束标志右大括号时会自动停止,或者可以有return,但是其后不跟任何表达式,表示执行到此处时返回。
2.对于非void型:其必须有return语句,并且return后表达式应与返回值的形式一样,不一样时就会进行自动类型转换(会导致数据不准确),执行return时,系统将自动生成无名变量用来储存,接受该值,函数的生命周期结束后,该空间立即被释放
A6:一个例子=W=
#include <stdio.h>
int fun(int i)
{
return i*i;
}
int main()
{
int i=0;//主函数定义的自动变量i
i=fun(i);
for( ;i<3;i++)
{
static int i=1;//复合语句中定义的静态变量i
i+=fun(i);
printf("%d",i);
}
printf("%d",i);
return 0;
}
其答案为:
2,6,42,3
前三个答案是i在循环里进行计算和表达
最后一个是输出了主函数定义里的i的值,也可以说的上是循环了几次。
本菜鸡的总结结束勒!