C语言--关于变量的作用与与生存期

@[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外部变量说明符表示声明的变量定义在别处,作用域是整个程序,生存期贯穿应用程序的开始和结束==

注意
autoregister均为动态存储
staticextern均为静态存储,静态存储的默认值为零,生存期为整个源程序,作用域只是定义他的文件,函数被调用时其中的局部静态变量的值保留前次被调用的结果。

一个例子

//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
例子的话,就下一节吧!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值