C 指针、引用详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++指针、引用详解.txt用快乐去奔跑,用心去倾听,用思维去发展,用努力去奋斗,用目标去衡量,用爱去生活。钱多钱少,常有就好!人老人少,健康就好!家贫家富,和睦就好。指针、引用与指针引用传值详解:(下文定义形式中的p都是标识符名,读者可自行修改)
1.指向常量的指针
可以改变指针指向哪个对象,但是不能改变指向对象的值
定义形式:
(const int*) p;
(int const*) p; //括号可以省去
测试内容:
--------------------
int a = 10;
const int b = 2;
const int* test_p;
test_p = &b; //正确,指向常量的指针可以指向常量
test_p = &a; //正确,这里隐式转换:test_p = (const int *)&a;(如果是从const int* 转换到int或者const int 的话,需要显式转换)
*test_p = 3;//错误,不能尝试修改所指的对象的值
a++;
cout<<*test_p;//将输出11(上一语句虽然不能用*test_p++来修改所指向的对象a,但是由于a是变量,直接对变量进行修改后,指针值*test_p也就指向a++的值了) //这种方法少用,造成用法不明确性
---------------------
//另加:
如果有
int *p;
const int b = 2;
p = &b;//错误,b是常量,普通指针不能指向常量,这是C++为了保证常量的只读性(毕竟如果p能指向b,那么根据定义*p的值就可以修改,这与常量不能重定义和修改矛盾)
---------------------
2.指针常量
可以改变指向对象的值,但不能改变指向的对象。
定义形式:
(int *const) p;//括号可以省去
测试内容:
---------------------
int a = 1;
int b = 2;
const int test_const = 3;
int* const test_p = &a; //必须初始化(这点与定义并初始化常量一样e.g: const int M = 0)
*test_p = 3; //正确,可以修改
test_p = &b;//错误,不能尝试修改所指对象
----------------------
//另外
//若在初始化时按以下操作
int* const test_p = (int *) &test_const; //必须显示(int *)转换,若没有的话,编译器会报错(毕竟test_p是int类型,而不是const int,若所指的对象为const int,则 *test_p = 3的操作会与常量不能重定义和修改矛盾)
----------------------
3.指向常量的指针
结合以上两个,只能在定义时初始化,之后不能修改所指对象,也不能修改所指对象的值,对上述的两个另外也需要做一些调整,这里就不说了。
定义形式:
const int* const p;
测试内容:
----------------------
int a = 1;
const int b = 2;
const int* const test_p0 = &a;//正确,可以指向变量
const int* const test_p1 = &b;//正确,可以指向常量
test_p0 = &b; /* or */ test_p1 = &a; //都错误,不能改变指向对象
*test_p0 = 0; /* or */ *test_p1 = 0; //都错误,不能改变指向对象的值
//注意
const int* const test_p0 = &a;
//上面初始化后,对a进行a++
a++;
//则输出的*test_p0为2
cout< ----------------------- 4.引用 引用相当于一个对象的昵称,如我名字叫小明,外号叫牛哥,以“小明”“牛哥”叫我都是一样,我独自共享两个“名字”,故引用只占一个变量的空间,与指针不同,指针声明时需要开辟新的内存空间来。对象名和引用名是困捆绑在一起。 定义形式: int& p = a;//一定要在定义的时候初始化值 测试内容: ------------------------ int a = 0; int& b = a; b++;/* or */ a++;//都正确,任何一个的值修改都会改变另一个的值(而且cout<<&b<<&a; 都是同一个地址值,而指针中int* p = &a; cout<<&p<<&a;是两个不同的地址值) //如果是const 引用的话: const int& b = a; b++;//错误,常引用(相当于常量)不能作修改。 ------------------------- 引用和常引用通常用来作函数传值参数,不占用内存,效率快一些。 指针传值和引用传值都会引起传入的参数数值的改变(除了指向常量的指针和常引用),具体用法请自行上机尝试一下。