目录
3. 号外:怎么看const修饰谁?到底是指针常量还是常量指针?
一、指针常量与常量指针的定义
int a = 1;int *p = &a,注意区别指针指向的值*p 与 指针的指向p ...
1. 指针变量:指针的指向是可以改变的指针,且指针指向的值只能是变量;
2. 指针常量:int* const p,指针的指向不能修改,但是可以修改指针指向的值;
3. 常量指针:const int* p ,指针指向的值是常量,不能修改。但是可以修改指针的指向,修改 成指向别的常量;
4. 常量指针常量:const int* const p,常量指针--指针指向的值是一个常量,指针指向的值不能 修改,且指针常量--指针的指向不能修改。
二、详细解释以及应用:
在了解这俩是什么之前,我们要先明白指针变量是什么...
p是一个指针变量,也就是我们口中常说的指针,指向的是变量的地址。
①p是变量,变量有自己本身的地址,可以被修改 --> 此时修改的是指针p本身的内容(指针的指向即指针的地址)
②p是个指针变量,解引用可以找到指针指向的地址的内容,且指针指向的内容没有被限制,可以被修改 --> 修改的是指针指向的内容*p一旦①或②被const限制住,相对应的部分就不能被修改,就有了指针常量和常量指针...
1. 指针常量(数组名是不可修改的左值)
看图说话:
指针常量,表示p本身不可以被修改,但是可以通过解引用p改变p指向的内容。也就是*p=2可行。
经典应用:数组名可作为指针常量。
示例:
数组名arr1不可被修改。因为数组名是数组首元素的地址,具有指针一部分的性质。所以其实在这里,arr1相当于指针常量。所以我们常说:数组名是不可修改的左值。
数组名是不可修改的左值,也是数组和数组之间不能直接赋值的原因。不能用arr1=arr2。
关于数组之间的赋值,可以看数组之间的赋值方法
2. 常量指针
看图说话:
常量指针,表示指针指向的内容不可修改,但是指针本身是可以被修改的。也就是p=&b可行。
经典应用:字符串指针就是常量指针。
示例:
👋🏻char* p1 = "abc" 怎么解释?
并不是把"abc"放进指针p中,而是将"abc"字符串中的第一个元素a的地址存放进指针p中;
字符串常量"abc"存放在内存中的只读数据区,不能被修改,是常量指针。
👋🏻 为什么p1,p2的地址一模一样?
因为字符串常量不会被改变,就是同一个字符串,内存中没必要存两份。并且指针中存放的是字符串常量首元素的地址,既然是同一个字符串的,当然地址也一样。
简单说,p1,p2指向同一块地址空间。
3. 号外:怎么看const修饰谁?到底是指针常量还是常量指针?
先思考一下这个题:
分析:const修饰只有两种情况,文章开头的绿色加粗字体也提到了:const修饰*p和const修饰p
int const *p 和 const int *p 修饰的都是*p,所以等价,选C
4. 常量指针常量
指向常量,指针不能改变指向的实体的值,指针值(即指针的指向)也不能改变(是2和3的结合)
如果想要指针的指向以及指针指向的值都不被修改,这个时候就可以用常量指针常量。应用场景暂时还没碰到,后续碰到追加...
🔊 题外话:在查找找资料验证结论的时候,发现一个博主总结的超级好。就是开头的那张图片,如果想看原版,可以去这里:点这里 🏃♂️🏃♂️🏃♂️🏃♂️🏃♀️🏃♀️🏃♀️🏃♀️