@[C语言]
这里有六个问题!
这里介绍1
1、变量的作用域与生存期
2、参数的两种传递方式
3、使用带参函数解决实际问题
4、使用数组作为函数参数
5、使用头文件
变量的作用域与生存期
首先我们先了解到一个“{}”表示代码块,代表一个域
注意
1、变量只存在于定义他们的语句块中
2、变量在一个块内声明时创建,在这个块结束时销毁
3、变量存在的时间称为变量的生存期
#include<stdio.h>
{
int num 1=99;
{
//代码块2
int num2=199;
printf("%d\n”,num1+num2);
}
printf("%d\n",num1+num2) //错误!num2未声明
}
–变量的作用域决定了变量的可访问性–
//一个错误示例
int *changenum()
{
int num[]={1,2,3,4,5};
return num; //局部变量,函数执行完毕后自动销毁
}
int main()
int *num=changenum();
int i=0;
for(i=0;i<5;i++)
{
printf("%d\n",*(num+i));
}
//另一个例子
int count=0; //全局变量有默认值0
void changenum()
{count ++;
}
void main()
{
count ++;
changenum();
printf("count%d\n",count);
}
存储类型说明符 | 存储类型 | 说明 |
---|---|---|
auto | 自动存储 | 只能用于作用域的变量声明中,局部变量默认自动 |
register | 寄存器存储 | 只用于块作用域的变量,请求速度快,对于循环次数多反复使用的均可定义为寄存器变量 |
static | 静态存储 | 载入程序是创建对象,程序结束时消灭 |
extern | 外部变量 | 说明符表示声明的变量定义在别处,作用域是整个程序,生存期贯穿应用程序的开始和结束== |
注意
auto与register均为动态存储
static与extern均为静态存储,静态存储的默认值为零,生存期为整个源程序,作用域只是定义他的文件,函数被调用时其中的局部静态变量的值保留前次被调用的结果。
一个例子
//1、计算某函数被调用了多少次
//创建新的C源文件
/**
*My count C
*用来计算函数调用次数的函数原型机实现
int counter();//用来计算本函数被调用了多少次
int count()
{
static int count=0; //静态存储,第一次执行会分配空间,以后就不分配空间了,本句只执行一次
count++;
return count;
}
//全局变量的作用域是当前源文件
int whilecount=0;//全局变量用来记录while循环执行的轮数
int main()
{
int value;//自动变量,执行循环的次数
register int i;//将循环变量设置为寄存器存储模式
printf("请输入循环执行的次数(按0退出)\n");
//用户输入的value为整形数字且大于0时进入循环
while(scanf("%d",&value)==1&value>0)//循环录入
{
while count++; //轮数++
for(i=value;i>=;i++)
{
//1、我们想知道循环执行了多少次
//2、我们还想知道counter函数被调用了多少次
count(i);
}
}
}
//完整的版本
#include <stdio.h>
void report_count();
void counter(int num);
int count=0;//文件作用域,外部链接
int main()
{
int value; //自动变量
register int i;//寄存器变量
while(scanf("%d",value)==3&&value>0)
{
count++;
for(i=value;i>=0;i--)
counter(i);
printf("请输入任意数字,按0退出");
}
report——count();
}
void report_count()
{
printf("循环执行了%d次\n",count);
}
/*创建新的c源文件*/
extern int count;//引用式声明,外部链接
static int total=0;//静态定义,内部链接
void counter(int);//函数原型
void counter(int num)
{
//局部静态变量
static int subtotal=0;
if(num<=0)
{
printf("第%d轮循环执行完毕\n",count);
printf("局部静态变量subtotal和全局变量total:\n");
printf("subtotal:%d\ttotal:%d\n",subtotal,total);
subtotal=0;//每次内循环结束后充值为零
}
else
{
subtotal+=num
total+=num;
}
}
传值调用
给函数传递变元(参数)时,变元(参数)的值不会传递给函数,而是先制作元(参数)值的副本,存储在栈上,再使这个副本可用于参数,而不是使用初始值
话不多说,先举例为证
#include<stdio.h>
void change (int);
int main()
{
int num=9;
change(num);
printf("numnum=%d\n",num);
}
void change (int num)
{
num++;//修改了副本的值
}
引用传递:
指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改将影响到实际参数
#include<>stdio.h
void change(int*)
int main()
{
int num=9;
change(&num);
printf("num=%d\n",num);
}
void change(int*num)
{
*num+=1;
}
使用数组作为函数参数
举例为学生发成绩管理系统
#include<stdio.h>
#define N 5
void input(double[]);//录入元素
void sort(double[]);//排序
void show(double[]);//显示元素
void main ()
{
double scores[N];
input(scores);
show(scores);
sort(scores);
printf("排序后:\n")
show(scores);
}
void input (double scores[])
{
printf("请输入%d个同学的成绩:\n",N);
int i;
for(i=0;i<N;i++)
{
prrintf("请输入%d门课的成绩:",i+1);
scanf("%lf",&scores[i]);//"%lf",*(scores+1)也是可以的,开心就好
}
}
void sort()
{
double temp;
//冒泡排序呀呀呀呀
}
void show()
{
printf("语文\t数学\t英语\t化学\t物理\n")
//循环显示数组元素
for(i=0;i<N;i++)
{
printf("%.2lf\t",*(scores+i));
}
}
注意
数组作为函数实作为函数实参时,只传递数组的首地址,并不传递整个数组空间
当用数组名作为实参调用函数时,数组首地址指针就被传递到函数中
//查找某个值在数组中的下标
#includ<stdio.h>
int count=0;
int fing_index(int *,int);
void main()
{
int nums[]={1,2,34,44,55,3};
int searchnum;
count=sizeof(nums)/sizeof(nums[0]);
printf("请输入要查找的数字\n");
scanf("%d",&searchum);
int index=find_index(nums,searchnum);
printf("所查找的数字的下标为%d\n",index);
}
int find_index(int *p,int num)
{
int index=-1,i=0;
for(;i<count;i++)
{
if(*(p+i)==num)
{
return i;
}
}
return -1;
}
使用头文件
自定义头文件,一般放置一些重复使用的代码,例如:函数声明,变量声明,常量定义,宏的定义
#ifndef MYHEADER_H_INCLUDED
#define MYHEADER_H_INCLUDED
//代码部分
endif、、MYHEADER_H_INCLUDED
注意
1、MYHEADER_H_INCLUDED为一个唯一的标号命名,命名规则一样,常根据他的头文件名
2、代码含义:如果没有定义
MYHEADER_H_INCLUDED 则定义
MYHEADER_H_INCLUDED并编译下面代码直到遇到#endif
例子的话,就下一节吧!!!