const基础知识
const int a; ==>一个常整形数
int const b; ==>一个常整形数
const int *c;==>一个指向常整形数的指针(const修饰的是指针所指向的内存空间,所指向的内存数据不能被修改,但指针本身可以修改)
int *const d;==>常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
const int *const e;==>一个指向常整形的常指针(指针和它所指向的内存空间均不能被修改)
合理利用const的优点:
指针做函数参数,可以有效的提高代码可读性,减少bug;
清楚的分清参数的输入和输出特性
int setTeacher_err(const Teacher *p)
const修改形参的时候,在利用形参不能修改指针所指向的内存空间
C语言中的const是一个冒牌货
C++语言中的const是一个真正的常量
结论:
C语言中的const变量:只读变量,有自己的存储空间;
C++中const常量:
可能分配存储空间,也可能不分配存储空间
当cont常量为全局,并且需要在其他文件中使用,=>分配内存空间
使用&操作符取const常量的地址,=>分配内存空间
const分配内存的时机:编译器编译期间
1 #include<iostream> 2 using namespace std; 3 struct Teacher 4 { 5 char name[64]; 6 int age; 7 }; 8 9 //指针所指向的内存空间不能被修改 10 int operatorTeacher01(const Teacher *pT) 11 { 12 //pT->age = 10; 13 return 0; 14 } 15 16 17 //指针变量本身不能被修改 18 int operatorTeacher02(Teacher *const pT) 19 { 20 pT->age = 10; 21 //pT = NULL; 22 return 0; 23 } 24 25 //指针变量本身不能被修改 26 int operatorTeacher03(const Teacher *const pT) 27 { 28 //pT->age = 10; 29 //pT = NULL; 30 printf("age:%d", pT->age); 31 return 0; 32 } 33 34 void main01() 35 { 36 Teacher t1; 37 t1.age = 33; 38 operatorTeacher03(&t1); 39 system("pause"); 40 return; 41 } 42 //C语言中的const是一个冒牌货 43 //C++语言中的const是一个真正的常量 44 void main02() 45 { 46 //好像a是一个常量 47 const int a = 10; 48 //a=11; 49 int *p = NULL; 50 p = (int *)&a; 51 *p = 20;//间接赋值 52 printf("a:%d\n", a); 53 printf("*p:%d\n", *p); 54 system("pause"); 55 } 56 57 //const分配内存的时机:编译器编译期间 58 void main03() 59 { 60 int a; 61 const int b = 10; 62 int c; 63 //a=11; 64 printf("&a:%d,&b:%d,&c:%d", &a, &b, &c); 65 system("pause"); 66 }//运行出来的结果是,b的内存地址介于a,c之间 67 68 //const 和#define 的相同之处 69 //#define 在编译预处理阶段处理 70 //const常量是由编译器处理的,提供类型检查和作用域检查 71 #define d 20 72 void main() 73 { 74 int a = 10; 75 int b = 20; 76 //int array[a + b];//在c++中编译不通过,在linux内核里面是成立的 77 //原因是linux内核编译器gcc支持,c和c++编译器不支持这种语法现象 78 const int c = 10; 79 const int e = 20; 80 int array2[c + d]; 81 int arrar3[c+e]; 82 system("pause"); 83 }