const
c语言中const修饰的量为常变量,可以通过一定的方法修改其值,如下代码:
# include<stdio.h>
int main()
{
const int i = 20;
int *p = &i;
*p = 30;
printf("%d\n", i);
return 0;
}
c++中const修饰的量为常量,值不允许改变(改变不了)。在编译期的时候将使用该常量值的地方替换成该常量的值。如下代码
# include<iostream>
using namespace std;
int main()
{
const int i = 10;
int *p = (int *)&i;
*p = 20;
cout << *p << " " << i << endl;//在编译时将此处i替换成10
//输出为20 10
return 0;
}
- c++中常量必须初始化
- const修饰的数据产生的符号时local类型的符号,因为其产生一个global类型的符号也没用,常量是在编译期的时候进行值的替换,编译是单文件的,所以其产生一个global类型的符号,别的文件中也没法引用它进行替换。
c++常量可以退化成常变量(编译期无法确定其值的时候会退化),如下操作
int c = 20;
const int s = c;
此时s就退化成一个常变量,因为在编译的时候常量进行替换,此时无法得知该用什么值进行替换s,在编译期间不
进行取值的过程。
void fun(const int a)
{
int *p = (int *)&a;
*p = 30;
cout << *p <<" " <<a;//此时常量啊,也退化成了一个常变量因为在编译时无法确认其值
}
int main()
{
const int d = 10;
int *p = (int *)&d;
fun(10);
}
- const修饰的类型是离它最近的完整类型
- const修饰的内容是它修饰类型的内容
- const修饰的内容不允许被改变
- 不允许泄漏常量的地址给非常量的指针
int b = 10;
int *p1 = &b;//正确
const int *p2 = &b;//正确
int *const p3 = &b;//正确
int *q1 = *b;
const int *q2 = &b;
int *const q3 = &b;
q1 = p1; //int *p1 ---> int *q1 正确
q1 = p2; //const int *p2 ---> int *q1 错误,(*p2)为常量,q1为非常量的指针
q1 = p3; //int *const p3 ---> int *q1 正确,常量为p3,没有泄漏p3的地址
q2 = p1; //int *p1 ---> const int *q2 正确,没有常量泄漏地址
q2 = p2; //const int *p2 ---> const int *q2 正确,p2 q2均为常量的指针
q2 = p3; //int *const p3 ---> const int *p2 常量为p3,没有泄漏p3的地址
引用(c++特有)
引用是变量的一个别名,引用底层是一个指针,在使用的时候替换成了指针的解引用
- 引用必须初始化
- 不允许泄漏常量的引用给一个非常量的引用
- 引用一个临时量,如下:
int fun()
{
return 1;
}
int main()
{
const int &p = fun();//引用一个不可寻址的常量,产生一个临时量(常量)供引用
return 0;
}
const int &p = 10;//也是产生一个临时量(常量)供引用
注意:
- 标准类型产生的临时量是常量
- 自定义类型产生的临时量是非常量
- 引用单独使用不参与类型
- const单独使用不参与类型
- const和引用结合使用参与类型
- const修饰指针,如果修饰的内容里没有*,则const不参与类型
c语言代码如c++代码如何互相调用
c++调用c语言代码:
extern "C" //用c语言的规则编译
{
调用的代码
}
c语言调用c++代码:
在cpp文件中将c语言要调用的代码,用c语言的规则编译即可