static与const都是c语言中的关键字,他们都可以修饰变量,函数等。
1.const
const与 变量
int x = 5; // 变量
const int x = 5;//在c++中,x是常量,在c语言中,x是不可改变的变量
const与指针类型
int a = 10;
int b = 20;
int *pa = &a;
int **ppa = &pa;
*ppa = &b;
**ppa = 30;
我们用图来表示各种指向关系。
注:图中给出的地址是假设的,并非真实地址。~~
(一)const与一级指针
eg:
int a= 10;
int const *pa = &a;
*pa = 30;
第2句语句是说,pa指向的内容是不可改变,第3句语句改变了pa指向的内容,所以,以上代码不正确。
int *const pa = &a;
pa = &b;
const 修饰pa,所以,pa的内容不可改变,就是里边只能存a的地址,语句3改变了pa的内容,所以以上代码不对。
(二)const与二级指针
eg:
int *pa = &a;
int **const ppa = &pa;
*ppa = &b;
**ppa = 30;
ppa不能改变,里边只能存放pa的地址。语句3,ppa指向b的地址,语句4是将ppa指向的b的地址的内容改为30,。并未改变ppa,所以以上程序正确。
eg:
int *const * ppa = &pa;
*ppa = &b;
ppa的指向即*ppa不可改变,第2语句改变ppa的指向,错误。
eg:
int const ** ppa = &pa;
**pa = 30;
ppa的指向的指向不可改变,错误。
const 与引用
int x = 3;
const int &y = x;
y = 5;//错误
2.static
(1)ststic修饰函数:这个函数只能在当前的.c文件可见,这样就可以在不同的.c文件中定义同名函数,而不引起冲突,只要其中一个函数用static修饰;
(2)static修饰局部变量:static变量定义在一个函数内,只有这个函数可以读取它,它的值在程序执行时一直保持;
(3)static修饰全局变量:ststic变量定义在一个文件中,只有这个文件可以读取它。
下边我们来看一道例题:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void fun1()
{
int i = 0;
for (i = 0;i < 10;i++)
{
static int m = 0;
m++;
printf("%d ",m);
}
printf("\n");
}
void fun2()
{
int i = 0;
for (i = 0;i < 10;i++)
{
int m = 0;
m++;
printf("%d ",m);
}
}
int main()
{
fun1();
fun2();
system("pause");
return 0;
}