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

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务