const 宏 变量作用域
1.const(常)
(1)定义及其注意事项
const相当于为变量上了一把锁,不允许随意更改
注意:如上图,const使用时必须初始化
那常量是否能找到办法更改呢-----有,但不建议
#include <iostream> using namespace std; int main() { const int a=8848; int *p=&a; *p=8800; }
这样就实现了常量的改变,但会受不同编译器的限制,而且常量的意义就是不随意改变,定义了一个常量但改变其数值是没意义的。
而且,当常量为全局常量时,不允许更改,会发生内存冲突
如图:全局常量会放在常量区,因此不可以随意修改
(2)如何制止间接访问影响const的作用
#include <stdio.h> using namespace std; int main() { int aa=4,bb=6; int const *p1=&aa;//此时常量指针表示指向常量的一个指针 //*p+=4;是不被允许的,因为常量指针指向一个不可变的常量。 int * const p2==&aa;//此时常量指针代表是一个常量的指针。 //p=0XFF21;是不被允许的,因为指针常量不是指针变量不可修改}
当然加两个const代表指向和内容都不可以改变
2.#define(宏)
(1)认识预处理后的代码以及简单使用宏
重新编译会发现无法正常运行
这就是预处理后的原代码变形效果(非常长)。
所以,其实#include <stdio.h>等头文件,或者函数声明,或者全局变量声明,都是一种复制粘贴所有头文件的文字,
将其打包在一起以便实现一些功能。
#include <stdio.h> int main() { //1.替换类型名称 typedef int INTEGER; #define INTEGER int //2.替换一个函数或者表达式 #define PT printf("Hello World!"); //3.嵌套宏替换 #define A PT PT PT PT PT }
(2)有参数的宏(用宏表达的函数)
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int len1 = sizeof(arr) / sizeof(arr[0]); int len2 = sizeof(arr) / sizeof(int); #define ARR_LEN1(arr_name) sizeof(arr_name)/sizeof(arr_name[0]); int len3 = ARR_LEN1(arr); #define ARR_LEN2(arr_name,type_name) sizeof(arr_name)/sizeof(type_name); int len4 = ARR_LEN2(arr, int); printf("%d %d %d %d",len1,len2,len3,len4); }
3.变量生命周期及其作用域
#include <stdio.h> int i ;//全局变量默认值是0; i = 100; void fun() { int i = 10; //此时i为10(临近原则) } /*此时函数中的i被回收,i又变回全局变量的i*/
因此变量遵循临近原则,无论在函数,还是循环中均适用。
4.外部(extern)
外部定义,内部使用,相当于标注该变量在外部已经被定义过了。
5.静态(static)
static 可以理解为全局变量,但是仅局限于当前源代码里,若另一个源代码用extern来访问,则在全局/静态区的静态变量无法访问。