一、const
1、修饰一般变量
const int a=10; int const a=10;//两种方式是相同的
const修饰的变量,不可以直接被修改,可以间接修改
直接修改
int main()
{
const int a = 10;
a = 20; //error
printf("%d", a);
return 0;
}
间接修改
int main()
{
const int a = 10;
int* p = &a;
*p = 20;
printf("%d", a);
return 0;
}
输出结果
const的意义:(并不属于硬性要求)
- 让编译器进行直接修改式检查
- 告诉其他程序员不要修改该变量
2、修饰数组
和修饰一般变量是一样的
int main()
{
const int arr[5] = { 1,2,3,4,5, };
arr[0] = 5;
arr[1] = 4;
arr[2] = 3;
arr[3] = 2;
arr[4] = 1;
}
3、修饰指针变量
const修饰指针的三种情况,指向的变量不可直接被修改,内容不可修改
int main()
{
int a = 10;
const int* p = &a;//p指向的变量不可直接被修改
int const* p = &a;//和上面是一样的
*p = 100;//error
p = 100;//true
}
int main()
{
int a = 10;
int* const p = &a;//p的内容不可修改,p的指向不可修改
*p = 100;//true
p = 100;//error
}
int main()
{
int a = 10;
const int* const p = &a;
*p = 100;//error
p = 100;//error
return 0;
}
4、修饰函数的参数
void show(const int* _p)//防止改变a的值
{
printf("%d", *_p);
}
int main()
{
int a = 10;
int* p = &a;
show(p);
}
5、修饰返回值
const int* gar()
{
int a = 10;
return &a;
}
int main()
{
int* p = gar();//虽然能运行但是会有报警,加上const报警消失,但是*p就不能修改了
*p = 20;
}
一般在内置函数中返回值加上const是没有意义的
一般在内置函数中返回值加上const是没有意义的
二、volatile(易变关键字)
volatile是为了防止编译器优化,让编译器更稳定的读取代码,volatile让每次读取代码都从内存当中读取
三、extern
使变量和函数可以跨文件访问
源文件test.c
#include"test.h"
int main()
{
printf("%d\n", a);
show();
}
源文件main.c
#include"test.h"
int a = 10;
void show()
{
printf("hahaha");
}
头文件test.c
#pragma once
#include<stdio.h>
extern int a;
extern void show();