*
前面的是对被指向对象的修饰,*
后面的是对指针自己的修饰
又叫常指针,能够理解为常量的指针,指向的是个常量html
int const* p; const int* p;
// // Created by zhangrongxiang on 2018/3/25 22:16 // File constant4 // #include <stdio.h> // 常量指针(被指向的对象是常量) int main() { int i = 10; int i2 = 11; const int *p = &i; printf("%d\n", *p);//10 i = 9; //OK,仍然能够经过原来的声明修改值, //Error,*p是const int的,不可修改,即常量指针不可修改其指向地址 //*p = 11; //error: assignment of read-only location ‘*p’ p = &i2;//OK,指针还能够指向别处,由于指针只是个变量,能够随意指向; printf("%d\n", *p);//11 return 0; }
本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值由于是常量,因此不能被赋值。指针
int* const p;
// // Created by zhangrongxiang on 2018/3/25 22:30 // File constan5 // //指针常量(指针自己是常量) #include <stdio.h> int main() { int i = 10; int *const p = &i; printf("%d\n", *p);//10 //Error,由于p是const 指针,所以不能改变p指向的内容 //p++;//error: increment of read-only variable ‘p’ (*p)++; //OK,指针是常量,指向的地址不能够变化,可是指向的地址所对应的内容能够变化 printf("%d\n", *p);//11 i = 9;//OK,仍然能够经过原来的声明修改值, return 0; }
指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。code
const int* const p;
// // Created by zhangrongxiang on 2018/3/25 22:38 // File constant6 // #include <stdio.h> int main() { int i = 10; const int *const p = &i; printf("%d\n", *p);//10 //p++;//error: increment of read-only variable ‘p’ //(*p)++;//increment of read-only location ‘*p’ i++;//OK,仍然能够经过原来的声明修改值 printf("%d\n", *p);//11 return 0; }
const int a
/ int const a
若是咱们给出 const int a
;你应该知道这是将a常量化了,可是为何那?那是由于int
和const
都做为一个类型限定词,有相同的地位。因此你也能够写成 int const a
;彷佛这样更加好理解!固然这都不难,难点在哪里哪?固然此时你若是定义指针也是能够修改的,可是会报警告!固然强制类型转换后警告也不会报了!htm
// // Created by zhangrongxiang on 2018/3/25 21:38 // File constant3 // #include <stdio.h> int main() { const int a; int const a2; int *pi = (int *) &a; *pi = 19; printf("%d\n", a);//19 pi = (int *) &a2; *pi = 20; printf("%d\n", a2);//20 return 0; }
const
修饰的变量真的不能改吗?const
修饰的变量实际上是能够改的(前提是gcc
环境下)。const
修饰的变量是不能够改的。const
修饰的变量到底能不能真的被修改,取决于具体的环境,C语言自己并无彻底严格一致的要求。gcc
中,const
是经过编译器在编译的时候执行检查来确保实现的(也就是说const
类型的变量不能改是编译错误,不是运行时错误。)因此咱们只要想办法骗过编译器,就能够修改const
定义的常量,而运行时不会报错。gcc
把const
类型的常量也放在了data
段,其实和普通的全局变量放在data
段是同样实现的,只是经过编译器认定这个变量是const
的,运行时并无标记const
标志,因此只要骗过编译器就能够修改了。const
究竟应该怎么用const
是在编译器中实现的,编译时检查,并不是不能骗过。因此在C语言中使用const
,就好象是一种道德约束而非法律约束,因此你们使用const
时更可能是传递一种信息,就是告诉编译器、也告诉读程序的人,这个变量是不该该也没必要被修改的。对象
那如何区分这几类呢? 带两个const的确定是指向常量的常指针,很容易理解,主要是如何区分常量指针和指针常量:blog
int const* p; //const * 即常量指针 const int* p; //const * 即常量指针 int* const p; //* const 即指针常量
int const* p; //const修饰的是*p,即*p的内容不可经过p改变,但p不是const,p能够修改,*p不可修改; const int* p; //同上 int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p能够修改;
const int p;
const int* p;
int const* p;
int * const p;
const int * const p;
int const * const p;
第一种是常量整数,没什么好说的。后面五种是指针,有一个简便的办法记忆。从右往左读,遇到p就替换成“p is a ”遇到, *就替换成“point to”。好比说②,读做:p is a point to int const.p是一个指向整型常量的指针。③读做:p is a point to const int.意思跟②相同。④读做:p is a const point to int.p是一个常量指针,指向整型。⑤读做:p is a const point to int const.⑥读做:p is a const point to const int.⑤和⑥的意思相同,p都是常量指针,指向整型常量。