目录

一、static关键字

二、const关键字

一、static关键字

在c语言中:

static是用来修饰变量和函数的

1.修饰局部变量——称为静态局部变量

2.修饰全局变量——称为静态全局变量

3.修饰函数——称为静态函数

有关内存相关知识补充:程序的所有数据,也就是所有的变量,都是存储在内存中的,而内存中又可以分为栈区、堆区、静态区。

1.1 static修饰局部变量

作用:1.static修饰的局部变量改变了变量的生命周期

2.让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束

3.改变变量的存储类型(位置):栈区/堆区—->静态区

代码演示:

由以上代码可以看出,在没有static修饰的时候每一次调用test函数,函数中i的值都会重新赋值,而当i变量由static修饰的时候,在test结束之后并没有被销毁,下次调用test函数时i的值仍然是上次调用时i++的值。

可以看出,由static修饰的局部变量生命周期变长了。

1.2 static修饰的全局变量

作用:如果一个全局变量被static修饰,那这个全局变量就只能在本源文件中使用,不能在其他源文件内使用。

代码演示:

//代码1//lin.cint bite_lin=20;//test.cextern bite_lin;//外部符号声明int main(){printf("%d\n",bite_lin);return 0;}//代码2//lin.cstatic int bite_lin=20;//test.cextern bite_lin;int main(){printf("%d", bite_lin);return 0;}

可以看出:static修饰的全局变量改变了这个全局变量的链接属性,使得这个全局变量由外部变量转变成内部变量,这个静态变量只能在自己的源文件内部使用,而不能在其他源文件内部使用。(简要的说:限制了使用范围,让人感觉作用域变小了

1.3 static修饰的函数

作用:static修饰的函数和修饰的全局变量类似,限制了函数的使用范围,使得该函数只能在本源文件中使用,而不能在其他源文件中使用。

代码演示:

//代码1//add.cAdd(int x, int y){return x + y;}//test.cextern Add(int x,int y);//外部函数声明int main(){printf("%d", Add(2, 3));return 0;}//代码2//add.cstatic Add(int x, int y){return x + y;}test.cextern Add(int x,int y);//外部函数声明int main(){printf("%d", Add(2, 3));return 0;}

可以看出,跟static修饰的全局变量一样,static修饰的函数使用范围被限制了。

二、const关键字

2.1 const修饰常变量

const修饰的常变量具有常量的特性,不能被修改,但本身还是个变量。

例:

这样子直接修改编译器会报错,是因为const修饰的常量是不能被直接修改的。

例:

这里报错是因为表示数组的元素个数必须是常量而不能是变量,这也作证了const修饰的变量本质上还是个变量。(注:在C++或者在其他比较新的C语言的标志中,const修饰的变量也可以用于表示数组的元素个数)

2.2 const修饰指针

可以看出,当遇到变量被const修饰时候,还可以通过指针的方式修改num的值,那么如果指针加上const会变得怎么样呢?

例:

1.当const放在*的左边的时候,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。(这里的左边,也可以是这样子放:int const* p,只要保证是*左边就可以)

但是指针变量本身的内容是可以改变的,例如:

2.const如果放在*的右边的时候,修饰的是指针变量的本身,也就是所指向内容的地址。

保证了指针变量的内容不能修改,但是指针指向的内容可以通过指针改变。

例如:

2.3 const修饰函数

用const修饰函数,主要是防止在传参的时候,在被传入的函数中传入的参数被修改。

1.“值传递”

代码演示:

形参被const修饰,那在此函数中的n就不能再被修改,如果修改将会报错。

2.“指针传递”

代码演示:

指针传递也是如此,当形参被const修饰的时候,在该函数中这给指针就不能被修改。

2.4 const修饰指针以及函数中的具体运用

我们在编写函数的过程中,如果要写出优秀的代码,那么在编写函数的过程中就要尽量的使用const修饰,这样可以避免当我们想要传入的参数不被修改时而不小心被修改导致bug的出现,增加了代码的可用性以及目的性。

以库函数中strcpy为例子,模拟此函数:

void my_strcpy(char* dest,const char* src)
{
while (*dest++=*src++)
{
;
}
}
int main()
{
char arr1[20] = “xxxxxxxxxxxxxxx”;
char arr2[] = “hello lin”;

my_strcpy(arr1, arr2);

printf(“%s\n”, arr1);
return 0;
}

因为我们这里的src是不想要被改变的,调用该函数的时候我们只是需要让该函数把scr的字符串拷贝到dest的字符串,为了防止在该函数中该字符串内容被改变导致出现bug,我们就可以用const去修饰该形参。