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来访问,则在全局/静态区的静态变量无法访问。

查看15道真题和解析