指针常量和常量指针的区别
一、指针常量
指针常量,指针的常量,指针用来修饰常量的,所以本质是一个常量,该常量是一个指针类型的常量(类似于整型常量,一个整型的常量)。
表示:char * const p;
(const 修饰 p ,所以 p 是一个常量,char * 表示一个指向字符型的指针,所以 p 表示指向字符型的指针的常量)
指针常量,指针本身是一个常量,始终指向某一固定地址,所以不能修改,p++ 是个错误表达,但是它指向的内容可以修改。
二、常量指针
常量指针,常量的指针,常量用来修饰指针的,所以本质是个指针变量,该指针变量指向的是一个常量。
表示:const char * p; (或 char const *p)
(const 修饰 char* ,表示一个字符型的常量指针类型,所以 p 是一个指向字符型常量的指针)
常量指针,指针指向的内容是不可修改的,但是因为本身是指针变量,所以自身是可以变动的 即 p++ 是可以的。
三、具体例子
1、指针常量
数组名,本质就是指针常量
char str[] = "hello";
//str++; //错误表达
printf("%c %c",++*str,*str);
//输出 i h
因为是指针常量,所以 str++ 错误;
但是 str 指向的内容可以变化,所以 ++*str 就是 i 。
2、常量指针
当定义字符串指针时,可用常量指针
const char *str = "hello";
//若不写 const 也可编译通过,但是会有warning
// ++*str; //错误表达
printf("%c %c",*(++str),*str);
//输出 e h
因为是常量指针,所以指针指向的内容不能修改;
但是指针自身可以 ++ 操作。
(因为 hello 是个字符串常量,所以若直接 char *str = “hello”,也是可以的,编译器会自动认为 str 为常量指针,但会有警告)