const和static的区别

const

const修饰的变量不能被更改,但是const修饰又有三种特殊的修饰方法。

  • const修饰指针——常量指针
  • const修饰常量——指针常量
  • const既修饰指针,又修饰常量

const修饰指针

1
const int *p = &a;(p为常量指针)

在被const修饰后,p为常量指针。

常量指证:指针的指向(即指向的地址)可以修改,但是指向的

数值不能修改。

const修饰常量

1
int *const p = &a;(p为指针常量)

指针常量:指针的指向不可以修改,指针指向的值可以修改

const既修饰指针,又修饰常量

1
const int* const p = &a;

指针指向的值和指向的地址都不能改。

static

static修饰的变量为全局变量,在局部函数进行完之后不会被销毁。

static修饰也有三种办法。

  • static修饰局部变量——静态局部变量
  • static修饰全局变量——静态全局变量
  • static修饰函数——静态函数

static修饰局部变量

static可使得局部变量出了自己的范围也不会销毁,本质上是改变了局部变量的生命周期,但其作用域还是局部的。
详细点说,就是有时我们希望函数中局部变量的值在函数调用结束后不销毁而继续保留原值,即希望其占用的存储单元不释放。在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值)。
这时就该指定该局部变量为“静态局部变量”,用关键字static 对其进行声明。

1
2
3
4
int fun()
{
static int c = 3;
}

另外,我们还要知道,
如果在定义局部变量时不给它赋初值,那么对静态局部变量来说,编译时自动赋初值0(对数值型变量),或者空字符’\0’ (对字符变量)。而对自动变量来说,其值是个不确定的值。

虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。

static修饰全局变量——静态全局变量

全局变量本身是具有外部链接属性的,即全局变量的作用域是整个工程,但是如果用 static 修饰全局变量,就会使得全局变量失去外部链接属性,变成内部链接属性,即只能在自己的文件中使用,所以 static 修饰的全局变量时,只能在自己的 .c 文件中使用。

static修饰函数——静态函数

函数默认是有外部链接属性的,但是被 static 修饰后,会使得函数失去外部链接属性,变成内部链接属性。所以 static 修饰的函数只能在自己所在的 .c 文件内部使用,不能在其他文件中使用。和 static 修饰全局变量 很像。