Linux C/C++——const
1.定义
在C/C++中,const通常被用来声明一个变量为常量,用法:const int a = 100,但在C和C++中,const还是有些区别。
2.在C语言中
①C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。
#include <stdio.h>
void test01() { const int a = 100; //const修饰的局部变量是放在栈区的,不能直接被修改,但可以通过地址修改 int *p = &a; *p = 10; printf("%d\n",a); } int main(int argc, char const *argv[]) { test01(); return 0; }
从上面的运行结果我们可以看到,在C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。
②如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。
#include<stdio.h> const int b = 100;//const修饰的全局变量不能被修改 void test02() { int *p = &b; *p = 10; printf("%d\n",b); } int main(int argc, char const *argv[]) { test02(); return 0; }
但在C语言中,如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。
③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。
const_in_c.c主程序
#include<stdio.h> extern const int num; void test03() { printf("%d\n",num); } int main(int argc, char const *argv[]) { test03(); return 0; }
c_test.c这个程序的num变量,被主程序调用
const int num = 12;
再写一个Makefile,编译上面两个程序
const:const_in_c.o c_test.o gcc -o const const_in_c.o c_test.o const_in_c.o:const_in_c.c gcc -c const_in_c.c c_test.o:c_test.c gcc -c c_test.c
运行结果
如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。
3.在C++中
①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。
#include<iostream> using namespace std; void test01() { const int a = 100; int *p = (int *)&a; *p = 10; printf("%d\n",a); } int main(int argc, const char** argv) { test01(); return 0; }
运行结果我们可以看出,会报错,所以是无法修改的。
②const修饰的全局变量放在常量区,它的值无法被修改。
#include<iostream> using namespace std; const int b = 100; void test02() { int *p = (int *)&b; *p = 10; printf("%d\n",b); } int main(int argc, const char** argv) { test02(); return 0; }
也同样是发生错误,因为C++中const修饰的全局变量的值是无法被修改的。
③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。
const_in_c++.cpp
#include <iostream> using namespace std; extern const int num; void test03() { printf("%d\n",num); } int main(int argc, const char** argv) { test03(); return 0; }
c++test.cpp
extern const int num = 99;
运行结果
3.总结一下
在C语言中:
①const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。
②const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。
③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。
在C++中:
①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。
②const修饰的全局变量放在常量区,它的值无法被修改。
③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。