金坷垃原版广告台词:指针、引用与指针引用传值详解

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 16:14:28
指针、引用与指针引用传值详解:(下文定义形式中的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++;//错误,常引用(相当于常量)不能作修改。
-------------------------引用和常引用通常用来作函数传值参数,不占用内存,效率快一些。
指针传值和引用传值都会引起传入的参数数值的改变(除了指向常量的指针和常引用),具体用法请自行上机尝试一下。