学习笔记:
变量的存储类型:
静态存储方式:在程序运行期间由系统分配固定存储空间;从程序开始执行到程序结束;
动态存储方式:根据需要进行动态的分配存储空间;从包含该变量定义的函数开始执行至函数执行结束。
局部变量(内部变量):
概念:在函数内部定义的变量;函数的形参也是局部变量。
作用域:局部变量的作用域只在本函数内有效;在复合语句内部定义的变量,其作用域是包含它的复合语句。
局部变量的存储方式(自动变量;静态局部变量;寄存器变量):
自动变量(auto)
函数中的局部变量,不做任何存储类别的说明都为自动变量。
说明:
自动变量必须在一个函数体的内部,分配在动态存储区。
自动变量不赋初值,其值不确定。每调用一起,重新赋值一次。
函数的形参也是自动变量。
"自动"体现在进入语句块时自动申请内存,退出时自动释放内存;对它们分配和释放存储空间的工作由编译系统自动处理
静态局部变量(static)
函数调用结束后不消失,不释放存储单元。
定义:static 类型说明符 变量名;
特性:
系统自动初始化为0,存放在静态存储区;生存期为整个程序运行期间;
静态局部变量和全局变量都是静态存储类型,作用域不同;
静态局部变量在编译时赋初值,每次调用不再赋初值,保留调用结束时变量的值。其值在整个程序运行期间都不释放。
寄存器变量(register)
为了减少存取变量的时间,C允许将变量的值存放在CPU运算器的寄存器中。
定义:register 类型说明符 变量名;
说明:
变量类型一般只限于整型,字符型或指向整型和字符型的指针,且只用于局部变量和形参。
全局变量和局部静态储存变量不能作为寄存器变量。
只能定义有限个寄存器变量;不能取寄存器变量的地址。
全局变量(外部变量):
概念:在函数外面定义的变量称为全局变量。
作用域:全局变量具有全局的作用域和生存期,从定义的位置到本文件结束都可以使用。
全局变量的存储方法(外部类型;静态类型):
外部全局变量
一个文件中要引用其他文件中定义的全局变量,应该在需要引用此变量的文件中进行说明。
例如:extern int x;
静态全局变量
一个文件中的全局变量仅限于定义它的文件引用,而不能被其他文件访问,需要用static进行说明。
例如:static int y;
一个当时想了半天的例题
#include
int a=4;
int f(int n)
{
int t=0;
static int a=5;
if(n%2)
{int a=6;t+=a++;}
else
{int a=7;t+=a++;}
return (t+a++);
}
int main()
{
int s=a,i=0;
for(;i<2;i++)
s+=f(i);
printf("%d\n",s);
return 0;
}
运行结果为28。
内部函数:
定义:内部函数是只能被本文件中其他函数调用的函数,又称静态函数。
格式:static int fun( int a, int b )
外部函数:
定义:外部函数是允许被其它文件调用的函数。
格式:[extern] int fun (int a, int b )
使用说明:例如在源文件A中调用另一源文件B中的函数fun,则需要在源文件A中对函数fun进行说明,格式为:extern int fun( );
编译预处理:
预处理是在编译之前对程序中的特殊命令进行的处理工作。预处理命令有:
#define 宏定义
#include 文件包含
#if() 条件编译
宏定义:
一般的宏定义:
#define 宏名 字符串
在预处理时,将程序中宏定义之后出现的所有的宏名,用宏替换字符串代替。这个过程也称为宏展开。
带参数的宏定义:
#define 宏名(形参表) 字符串
调用格式:宏名(实参表)
终止宏定义:
#undef 宏名
一个上当的题目
#define X(a) a*a
int main()
{
printf("%d\n", X(4+5));
return 0;
}
答案是29!宏展开时候不会带括号,直接把字符串替换,如果想得到想要的答案最好在宏定义的时候加上括号(a)*(a)。
文件包含:
#include "文件名":先在当前目录下查找,再到系统指定目录下查找。
#include :在系统指定目录下查找。
条件编译:
格式:
#if 表达式
程序段 1
#else
程序段 2
#endif
当表达式为非 0 时,编译程序段 1,否则编译程序段 2;
#ifdef 宏名
程序段 1
#else
程序段 2
#endif
当宏名已经被 #define 命令定义过,则编译程序段 1,否则编译程序段 2。
课后测验:
输出最大、最小数
编写函数,通过键盘输入10个整数,找出其中最大的数和最小的数,返回到主调函数中输出。
输入:2 3 4 1 7 6 8 9 26 35
输出:max=35,min=1
我的思路:
开始想得很麻烦,定义两个函数用一一比较的方法一个求最大一个求最小,后来想了一下,定义一个无返回值的函数和两个全局变量就可以同时输出了。
#include
int max=1,min=1;
void max_min(int a[])
{
int i;
for(i=0;i<10;i++)
if(a[i]>max)max=a[i];
else if(a[i]
}
int main()
{
int i,a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max_min(a);
printf("max=%d,min=%d",max,min);
return 0;
}
任意整数转换为千分位分隔的字符形式。
编写函数,对于任意输入的一个整数,转换为千分位分隔的字符形式,在主函数中调用并输出。
输入样例:123456
输出样例:123,456
我的思路:
定义一个全局变量的数组a,然后编写一个函数,一直除10取余放入局部变量b数组里,再将b数组逆向输出到a数组,其中a[3]为';',由于a数组定义的是char型,而数据为int型,所以要输出对应数字字符需要+48。
#include
#define N 10
char a[N];
void s(int n)
{
int i=0,j=0;
char b[N];
while(n)
{
b[i++]=n%10;
n=n/10;
}
for(i=i-1;i>=0;i--)
{
if(j==3)
{
a[j]=',';
j++;
}
a[j++]=b[i]+48;
}
a[j]='\0';
}
int main()
{
int x,i;
scanf("%d",&x);
s(x);
for(i=0;a[i]!='\0';i++)
printf("%c",a[i]);
return 0;
}