const和*p的几种组合的定义
const和指针的不同的组合代表着不同的意义,对于初学者而言,区分它们有些困难,且不容易记忆。要使用好它们需要理解它们代表的不同意义以及它们的使用场景。本篇文章主要讲一下四种组合的区分以及使用,它们分别是:
1.const char *p:表示的是指向常量字符的指针,即指针所指向的内容是常量,不能通过该指针修改指向的内容。
2.char const *p:等同于const char *p。
3.char * const p:表示指针本身是常量,不能指向其他地方,但可以修改指针指向的内容。
4.const char * const p:指向常量字符的常量指针,表示指针本身和指针指向的内容都是常量,既不能改变指针的指向,也不能通过该指针修改指向的内容。
区分这几种类型的技巧
通过阅读他们的文字解释,我们难以长期记忆和理解它们。我将分享我记忆和区分它们的方法。我们可以从右往左读,这有助于我们理解其含义。例如:
1.const char *p:p是一个指向 const char 的指针。
2.char * const p:p 是一个 const 指针,指向 char。
3.const char * const p:p 是一个 const指针,指向 const char。
注意,我们将一个指针修饰成常量指针,需要* const p而不是const *p。我们需要知道,指向常量的指针和常量指针的区别,前者定义了一个只能指向常量的指针,被指向的是常量,是不可修改的,后者的指针是个常量指针,常量指针指向的对象是非常量,是可以改变的,但是常量指针不能指向其他变量。对于const char * const p来说,它是一个指向常量的常量指针,指向的对象不可变,也不能改变指针指向谁。
在学习C语言的过程中,我们经常拿房卡和房间比作指针和指针指向的对象。上述的描述或许有些拗口,在这里我们也借助这个比喻来帮助理解const和指针的不同组合。我们定义了一个指针,实际上就是在计算机中分配了一块内存,这块内存可以看出酒店前台存放房卡的小盒子或者小格子。在我们没有定义指针指向谁的时候我们可以把这个小盒子看出是空的。所谓常量指针就是指这个指针里面指向的对象不能换,即盒子里放了指定房间的房卡,且这个盒子只能放这张卡。而指向常量的指针可以理解为酒店的某些房间里面的家具、床等物品是不能搬走或者移动的,已经被固定好了,而进入这些房间的房卡就被称为“指向常量的指针(const char *p)”。所以我们来用比喻的方式总结一下:
1.const char *p/char const *p:定义了存放了进入家具被固定的房间的房卡的小盒子,小盒子里面的房卡可以换成其他进入“固定家具房间”的房卡。
2.char * const p:定义了一个一张进入常规房间(家具可以进行改变)的房卡放在盒子里,盒子里的卡不能替换。
3.const char * const p:定义了一张进入“固定家具房间”的房卡放在盒子里,且盒子里卡的不能更换。
例子和应用场景
1.const char *p/char const *p:
于函数参数,表示传入的字符串不能被修改。
void printString(const char *p) {
// 不能修改 p 指向的内容
printf("%s\n", p);
}
2.char * const p:
用于需要固定指向某个位置但可以修改该位置内容的场景。
void modifyString(char * const p) {
p[0] = 'A'; // 可以修改指向内容
// 不能改变 p 的指向
}
3.const char * const p:
用于既不希望指针指向的内容被修改,也不希望指针本身被修改的场景。
const char text[] = "Hello";
const char * const p = text;
// 不能修改 p 指向的内容
// 不能改变 p 的指向

821

被折叠的 条评论
为什么被折叠?



