我的WordPress网站,公章在线制作网站做不了,深圳网站建设 湖南岚鸿,设计手机网站在C中#xff0c;const修饰符用于声明常量#xff0c;有两种常见的形式#xff1a;顶层const和底层const#xff0c;它们之间的区别在于它们修饰的对象及其在不同场景中的作用。
1. 顶层const (Top-level const)
顶层const用于修饰变量本身#xff0c;使其成为常量。这意…在C中const修饰符用于声明常量有两种常见的形式顶层const和底层const它们之间的区别在于它们修饰的对象及其在不同场景中的作用。
1. 顶层const (Top-level const)
顶层const用于修饰变量本身使其成为常量。这意味着变量的值不能被修改。例如
const int a 10;在这段代码中a是顶层const表示a的值不能被改变。
作用限制变量本身使其不能被修改。应用场景通常用于声明某个变量的值不可改变。
2. 底层const (Low-level const)
底层const则用于修饰指针或引用所指向的对象使得通过指针或引用不能修改该对象的值。例如
const int* ptr;这里ptr是一个指向int常量的指针ptr本身可以指向不同的地址但不能通过ptr修改所指向对象的值。
作用限制指针或引用指向的对象的可修改性。应用场景用于指针或引用使其无法修改所指向的对象的值。
例子区分顶层const和底层const
int x 5;
const int* p1 x; // p1是底层const不能通过p1修改x的值
int* const p2 x; // p2是顶层const不能改变p2指向的地址
const int* const p3 x; // p3既是顶层const又是底层const既不能修改p3指向的地址也不能修改x的值p1是一个指向int常量的指针底层const可以改变指针的指向但不能通过p1修改所指向对象的值。p2是一个常量指针顶层const即指针本身是常量不能改变其指向的地址但可以通过p2修改指向对象的值。p3同时是顶层和底层const既不能修改指针的指向也不能修改指针指向对象的值。
总结顶层const用于限制变量本身的修改底层const用于限制通过指针或引用修改所指向的对象。 我将逐行分析这些代码并解释其中的关键点帮助你理解顶层const和底层const的作用。
const int a 10;
int b a;a是顶层const表示它是一个常量值为10不能被修改。b是一个普通的整数它的值被初始化为a的值即10这在C中是合法的因为b不是const类型。
const int *const p new int(10);
int *p1 p; // 错误
int *const p2 p; // 错误
const int *p3 p;p是一个顶层和底层const指针const int*表示p指向一个const int底层const即通过p不能修改其所指向的值const p顶层const表示p本身是一个常量指针不能修改它指向的地址。p1的类型是int*试图将const int*类型的p赋值给非const的p1这是非法的编译器会报错。因为p1可以修改所指向对象的值但p不能。p2的类型是int *const表示p2是一个常量指针不能改变指向的地址但可以通过p2修改指向对象的值。由于p是const int*不能通过p2修改对象的值因此也是非法的。p3的类型是const int*与p兼容因此可以赋值。
int *p4 a; // 错误a是const int但是p4是一个普通的int*这意味着通过p4可以修改a的值。这是非法的因为a是一个常量不能通过普通指针来修改。
const int r1 20;
int r2 a; // 错误
int r3 r1; // 错误r1是一个对const int的引用绑定到字面值20上这是合法的因为C允许const引用绑定到字面值或常量表达式。r2是一个普通的引用试图引用a但a是const不能通过非const引用绑定到常量。r3也是一个普通的引用试图引用r1但由于r1是constr3不能通过非const引用绑定到一个const引用上。
结论
顶层const限制变量本身的修改如p指向的地址不能被修改。底层const限制通过指针或引用对对象值的修改如p指向的值不能被修改。非const指针或引用不能指向const对象或通过非const引用绑定const对象。
p3的类型是const int*与p兼容因此可以赋值。这个如何理解
这句话的意思是p3的类型是const int*而p的类型是const int *const。虽然p是一个常量指针顶层const但它指向的是一个const int类型的值底层const因此p的底层类型与p3相同都是指向const int的指针。
详细解释
const int *const p new int(10); // p 是 const 指针指向 const int
const int *p3 p; // p3 是指向 const int 的普通指针p的类型const int *const p const int *表示指针指向一个const int类型的对象底层const即不能通过该指针修改所指向的整数值。const p表示p本身是一个常量指针顶层const也就是说指针的地址不能改变。 p3的类型const int *p3 const int *表示指针p3指向一个const int类型的对象底层const即不能通过该指针修改所指向的整数值。
为什么p3可以赋值为p
尽管p是一个常量指针顶层const但p3不需要关心p本身是否是常量指针p3只关心p指向的对象类型底层const。由于p指向的是一个const int这与p3的类型兼容因此可以赋值。
具体来说
p指向的是const int这与p3的底层const要求兼容。赋值时p的顶层const即指针本身不可修改并不影响赋值给p3因为p3本身不是常量指针允许指针指向其他地址。
因此p3可以指向与p相同的地址但不能通过p3修改指向的值因为是const int*。