一、指向常量的指针
例1
int main()
{
int num =5;
const int fun =100;
int *pi;
const int *pci;
pi =#
pci =&fun;
printf("num addr:%p value :%d\n",&num ,num);
printf("fun addr:%p value :%d\n",&fun ,fun);
printf("pi addr:%p value :%p\n",&pi ,pi);
printf("pci addr:%p value :%p\n",&pci ,pci);
printf("pci value :%d\n",*pci); //只是读取整数的值,合法
return 0;
}
结果输出
我们不能解引指向常量的指针并改变指针所引用的值,但是可以改变指针。
例2
int main()
{
const int fun =100;
const int *pci;
pci =&fun;
pci =4; //此行不合法
printf("pci value :%d\n",*pci);
return 0;
}
指针可以改为指向另外一个整数常量或者普通整数。
例3
#include <stdio.h>
int main()
{
int num =8;
int const a=10;
const int *pci;
const int *pci_1;
pci =#//指向普通整数
pci_1 =&a;//指向整数常量
printf("pci addr:%p value :%p\n",&pci ,pci);
printf("pci_1 addr:%p value :%p\n",&pci_1 ,pci_1);
printf("pci value :%d\n",*pci);
printf("pci_1 value :%d\n",*pci_1);
return 0;
}
结果
总结:
1、指向整数常量的指针可以被修改指向不同的整数常量。
2、指向整数常量的指针可以被修改指向不同的非整数常量。
3、可以解引指向整数常量的指针读取数据。(例1的第五printf)
4、const int *p 与 int const *p 是等价的,因人而异。
二、指向非常量的常量指针
1、p 必须被初始化为指向非常量变量。
2、p不能指向常量,因为数据不能被修改,所以导致报错。
3、p指向的数据可以被修改,因为指向的是变量。
4、一旦初始化把地址赋给p之后,不能继续赋新的值。(如例4)
例1
#include <stdio.h>
int main()
{
int num =888;
int *const p=#//p 必须被初始化为指向非常量变量
printf("p value :%d\n",*p);
return 0;
}
例2
#include <stdio.h>
int main()
{
int num =888;
int const a=666;
int *const p=#//p 必须被初始化为指向非常量变量
int *const p1=&a; //p 指向常量报错,不可以这样初始化
printf("p value :%d\n",*p);
printf("p1 value :%d\n",*p1);
return 0;
}
报错信息如下
解引操作:
例3
#include <stdio.h>
int main()
{
int num =888;
int *const p=#//p 必须被初始化为指向非常量变量
printf("p value :%d\n",*p);
*p=666;//无论p引用了什么,都可以解引p然后赋一个新值
printf("p value :%d\n",*p);
return 0;
}
例4
#include <stdio.h>
int main()
{
int num =888;
int ber =123;
int *const p=&ber;//p 必须被初始化为指向非常量变量
p=#//不能被重新赋值
printf("p value :%d\n",*p);
return 0;
}
三、指向常量的常量指针
这个用法用的很少。这种指针本身不能修改,指向的数据也不能通过TA来修改。
const int * const p=#
在第二部分的例子3的基础上加const。
#include <stdio.h>
int main()
{
int num =888;
int const a=666;
int *const p=#//p 必须被初始化为指向非常量变量
const int *const p1=&a; //在第二部分的例子3的基础上加const,指向常量的常量指针
printf("p value :%d\n",*p);
printf("p1 value :%d\n",*p1);
return 0;
}
结果 p value : 888
p1 value : 666
四、总结
const(*号)左边放,指针变量指向常量;
const(*号)右边放,指针常量指向变量;
const(*号)两边放,指针常量指向常量;
参考文献:《深入理解C指针》