c语言中的static 和const

C语言中static 和 const使用

static
static在C语言中主要是两种用法
1、修饰局部变量
2、修饰函数和全局变量
局部变量按照存储形式来分,分为auto,static,register
首先从内存四区的角度去看,auto即为普通的局部变量,存储在栈上,当函数结束时,随之释放。

register为寄存器变量,存放在寄存器里面,调用速度快。
在C语言中register变量不能取地址,会报错。
而在c++中,对register做了增强,党C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。

static修饰局部变量时该变量是存放在静态存储区,生命周期是整个程序结束。

static局部变量初次定义时就要初始化,且只能初始化一次。如果在定义的时候不初始化,编译器就会自动赋值为0;(也就是说如果重复调用同一个函数,在第二次调用时,就不会再执行static局部变量初始化那句话 了)

特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.

void staticLocalVar()
{
static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作
printf(“%d”,a);
a++;
}
int main()
{
staticLocalVar(); // 第一次调用, 输出a=0
staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1
return 0;
}

注意事项:
1. “记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.
2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 —- 不可重入性

二、
当static修饰全局变量或者函数时,不是为了限制其存储方式,而主要是为了限制该全局变量或者函数的作用域仅限于本文件,所以又称为内部函数。此件时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文)内部.
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

装载自:https://blog.csdn.net/y780465649/article/details/52155641

const

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点:

1、预编译指令只是对值进行简单的替换,不能进行类型检查

2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性

3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

下面我们从几个方面来说一下const的用法:

一、修饰局部变量

const int n=5;
int const n=5;

1
2
3

这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变脸初始化,否则之后就不能再进行赋值了。

接下来看看const用于修饰常量静态字符串,例如:

const char* str=”fdsafdsa”;

1
2

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

二、常量指针与指针常量

常量指针是指针指向的内容是常量,可以有一下两种定义方式。

const int * n;
int const * n;

1
2
3

需要注意的是一下两点:

1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

int a=5;
const int* n=&a;
a=6;

1
2
3
4

2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。

int a=5;
int b=6;
const int* n=&a;
n=&b;

1
2
3
4
5

指针常量是指指针本身是个常量,不能在指向其他的地址,写法如下:

int *const n;

1
2

需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。

int a=5;
int *p=&a;
int* const n=&a;
*p=8;

1
2
3
4
5

区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。

指向常量的常指针

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

const int* const p;

1
2

三、修饰函数的参数

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

1、防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);

1
2

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

2、防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )

1
2

指针p1和指针p2指向的地址都不能修改。

3、以上两种的结合。

四、修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例如函数

const char * GetString(void);

1
2

如下语句将出现编译错误:

char *str = GetString();

1
2

正确的用法是

const char *str = GetString();

1
2

五、修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
转载自:https://blog.csdn.net/xingjiarong/article/details/47282255

总结一下
就是static用于全局变量和函数用于限制作用域,只允许在本文件中使用。在C语言中,一般进行声明之后全局变量及函数可以整个程序使用,但是如果有static修饰则只能在同一个c文件使用;
用于局部变量是用于存储的不一样,存储将会没有可重复性,第二次调用函数将会使用上一次停留的结果。
const就不多做说,自己看吧,这个博客写的很好。

  • 24
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: staticconst都是C语言的关键字,但它们的作用不同。 static用于修饰变量或函数,表示它们具有静态存储方式,即在程序运行期间一直存在,不会随着函数的调用或变量的使用而被销毁。对于静态变量,它们的值在程序运行期间只会被初始化一次,而对于静态函数,它们只能在本文件被调用。 const用于修饰变量,表示该变量的值在程序运行期间不可改变。一旦被初始化,就不能再被修改。const常用于定义常量,以提高程序的可读性和可维护性。 因此,staticconst的作用不同,但它们都可以提高程序的性能和可靠性。 ### 回答2: C语言staticconst这两个关键字是程序常见的两个关键字,它们分别代表的是静态和常量,具有不同的作用和用途。下面我将就它们的区别做一些详细的介绍: 1. staticstatic关键字在C语言表示静态,它可以用来修饰全局变量和局部变量。如果static修饰全局变量,则该变量的作用域仅限于当前文件,不会对其他文件造成影响,如果在不同的文件定义了具有相同名称的static变量,则它们并不会互相影响;如果static修饰局部变量,则该变量仅能在该函数内部使用,无法在函数外部被访问。使用static变量的好处是可以减少全局变量的使用,避免命名冲突,也有助于提高程序的性能。 2. constconst关键字在C语言表示常量,即该变量的值在程序运行过程不可修改。const关键字可以用来声明常量,例如: const int MAX_VALUE = 100; const关键字可以修饰指针,表示指针指向的变量是常量,例如: const int* p = &i; 表示指针p指向的变量是一个常量。 在使用const关键字时要注意的是,使用const修饰的变量在定义时即要进行初始化赋值,否则会出现编译错误。另外,const关键字也可以用来修饰函数参数,表示该参数是一个常量,函数体内不能修改该参数的值。 3. staticconst的区别: static表示静态,用于修饰变量或函数,可以限制变量或函数的作用域和可见性,在程序运行期间只分配一次内存,有助于提高程序的性能。 const表示常量,用于修饰变量或函数参数,表示该变量或函数参数的值在程序运行期间不可修改。 staticconst两个关键字的区别在于它们的作用不一样,一个是限制变量或函数的作用域和可见性,一个是限制变量的可修改性,但它们都有助于提高程序的性能。 ### 回答3: 在C语言staticconst都是重要的关键字,它们会影响到变量或函数的作用域,以及是否可以更改它们的值。 static关键字用于定义一个局部变量或函数,指示它们只能在定义它们的文件使用,不能在其他文件使用。这可以有效地避免命名冲突和符号重复定义问题。static变量还可以被初始化,但只有在程序运行的第一次执行期间才会分配存储空间,之后就一直存在于内存,直到程序结束。同时,static函数只能被本文件内部的其他函数调用,而无法被其他文件调用。 const关键字用于定义常量,也就是一旦初始化后其值不能再被更改的变量。const变量在程序发挥了很重要的作用,它可以防止意外地更改数据、增加代码的可读性,并可以帮助编译器进行代码优化。const声明的变量在链接时也会被视为是只读的,因此不会被误修改。const声明的常量可以使用文字或表达式初始化,并且一般是用大写字母来命名,以便与普通变量区分。 总之,static用于限制变量或函数的作用域,而const用于定义常量并避免数据被更改。两者都是C语言非常重要的关键字,程序员在使用它们时需要注意它们的具体用处及其影响。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值