在编程中,我们常常会因为一些奇怪的定义犯懵,比如接下来的一个定义
const char * const pcName;
这是什么,为什么在用const声明变量的前提下,后面的指针变量前面还有一个const,这就不得不提到指针常量和常量指针,接下来的三种变量声明方式:
const char* ptr1;
char const* ptr2;
char* const ptr3;
我们先暂且不管上面三个变量的初始化是否合理(第二种声明方式其实和第一种一样),现在我们一个一个来看着三种变量的初始化的不同。
(先简单说明const的作用:当我们需要定义一个变量,但是我们希望这个变量的值不能被改变,在整个作用域中都保持固定。这个时候就可以使用const
关键字对变量加以限定;当我们用const定义常量时,必须初始化赋值,比如const int a = 100;或者const char name = ‘c’;等等)
接下来再记住一个重要的口诀,我们想弄懂指针常量和常量指针,就必须搞清楚const是用来修饰谁,当const出现在*前面则const是用来修饰指针指向的对象,此时为常量指针(const *),此时指针的指向可以修改,但是指针指向的值不能修改;当const出现在*后面则const用来修饰指针变量本身,此时为指针常量(* const),此时指针的指向不可以改变,但是指针指向的值可以修改,懂了这句话,现在我们就可以
1.首先是 const char* ptr1;按照指针的定义方式,现在指针的类型为char*型,根据上面的口诀,const出现在*前面,则const用于修饰指针指向的对象,那么此时指针指向的对象是一个常量,通过以下代码验证:
void test18()//常量指针和指针常量
{
const char num1 = 'c';
const char* pstr1;
pstr1 = &num1;
printf("*pstr1=%c\n", *pstr1);
}
输出结果*pstr1=c,也就是说pstr指向的内容是常量,这是正常且正确的用法,为什么这么说呢,其实这种定义方式,指向的内容也可以不是通过const初始化的常量,如:
void test18()//常量指针和指针常量
{
const char num1 = 'c';
char num2;
num2 = 'd';
const char* pstr1;
pstr1 = &num1;
printf("*pstr1=%c\n", *pstr1);
pstr1 = &num2;
printf("*pstr1=%c\n", *pstr1);
}
此时最后输出的内容为*pstr1=d,好像和平时的指针变量没有什么区别,但是指针变量的使用有一个非常重要的用法,即使用指针变量赋值,如果pstr1是指针变量的话,我们可以通过*pstr1=‘a’的方式为pstr1所指向的内容赋值,但是由于const的修饰,使得指针指向的内容是常量,常量的值是不能改变的,也就是说不能通过“*pstr1=”的方式为指向内容赋值值,即使上面例子中所指向内容不是常量,也不能赋值。
2.接着上面的第二个定义方式,char const* pstr2;还是利用上面的口诀,const出现在*前面,则const是用于修饰指针,其实第二个定义方式使用方法和第一个定义方式完全一致,这两种定义方式中的pstr1和pstr2被称为常量指针。
3.现在是第三个定义方式,char* const pstr3;根据口诀,const出现在*的后面,则const是用来修饰指针本身,用来修饰指针本身则被我们成为指针常量,指针常量代表这个指针是一个常量,指针是什么,指针是一个地址,也就是这个地址不能改变,现在我们应该能够理解,为什么在初始化的时候,直接写char* const pstr3;会报错,因为pstr3是常量,常量在初始化的时候必须赋值,报错是因为没有赋值,接下来我们在代码中看看:
void test18()//常量指针和指针常量
{
const char num1 = 'c';
char num2 = 's';
const char* pstr1;
//char* const pstr3;//报错,因为没有给pstr3赋值
char* const pstr3 = &num2;
pstr1 = &num1;
//*pstr1 = 'b';//报错,因为*pstr1在编译器中识别为常量,常量不能重新赋值
printf("*pstr1=%c\n", *pstr1);
printf("*pstr3=%c\n", *pstr3);
*pstr3 = 'o';
//pstr3 =&num1;//报错,因为pstr3是常量,常量不能重新赋值
printf("*pstr3=%c\n", *pstr3);
}
输出结果为
*pstr1=c
*pstr3=s
*pstr3=o
4. 回到这篇文章的开始
const char * const pcName;
上面这个定义到底是指针常量还是常量指针,其实这个是一个指向常量的常量指针
这代表什么,代表pcName既不能通过*pcName给指向的内容重新赋值,也不能通过pcName=&..的方式指向其他内容。
以上就是全部内容,如果觉得上面内容对你有帮助的话,就帮我点个赞吧!谢谢!