要有具备扎实指针知识……
了解引用、指针的一些注意事项:
1、引用并非对象
2、引用必须**初始化**
3、引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
4、类型要严格匹配
一、常量指针
定义:
又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。
特点:
1、常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
2、常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
3、指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
**表示形式**
int const* p1; const int* p1;
二、指针常量
定义
本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
特点
1、它是个常量!
2、指针所保存的地址可以改变,然而指针所指向的值却不可以改变
3、指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
表示形式:
int* const p1;
三、两者区别
//-------常量指针------- //
1、const int *p1 = &a; a = 200; //OK,仍然可以通过原来的声明修改值,
2、 // *p1 = 13; //Error,*p1是const int的,不可修改,即常量指针不可修改其指向地址
3、p1 = &b; //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;
//-------指针常量-------//
1、 int* const p2 = &a; a = 200; //OK,仍然可以通过原来的声明修改值
2、 *p2 = 900; //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
3、 //p2 = &b; //Error,因为p2是const 指针,因此不能改变p2指向的内容
补集一个:
//-------指向常量的常量指针-------//
1、 const int* const p3 = &a; //*p3 = 1;
2、//Error //p3 = &b; //Error
3、 a = 10; //OK,仍然可以通过原来的声明修改值
四、代码实现、实例讲解
-------常量指针-------
#include <stdio.h>
int main()
{
int a;
int b;
const int *p1 = &a;
a = 300; //OK,仍然可以通过原来的声明修改值,
b = 100;
//*p1 = 60; //Error,*p1是const int的,不可修改,即常量指针不可修改其指向地址
printf("a=%d\n",p1);
printf("a=%d\n",*p1);
p1 = &b; //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;
printf("a=%d\n",p1);
printf("a=%d\n",*p1);
return 0;
}
运行结果:
p1的地址=0060FF08
p1的值=300
p1的地址=0060FF04
p1的值=100
小结:所以在定义常量指针时要给予赋值,不然p1不能修改;
想要修改p1的值,就得定义时赋值,在修改赋值的变量的地址,在对p1进行修改。
-------指针常量-------
#include <stdio.h>
int main()
{
int a;
int b;
int* const p2 = &a;
a = 900; //OK,仍然可以通过原来的声明修改值,
printf("p2的地址=%p\n",p2);
printf("p2的值=%d\n",*p2);
*p2 = 100; //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
printf("p2的地址=%p\n",p2);
printf("p2的值=%d\n",*p2);
// p2 = &b; //Error,因为p2是const 指针,因此不能改变p2指向的内容
return 0;
}
运行结果:
p2的地址=0060FF08
p2的值=900
p2的地址=0060FF08
p2的值=100