当前位置:文档之家› C 指针、引用详解

C 指针、引用详解

C  指针、引用详解
C  指针、引用详解

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++;//错误,常引用(相当于常量)不能作修改。

-------------------------

引用和常引用通常用来作函数传值参数,不占用内存,效率快一些。

指针传值和引用传值都会引起传入的参数数值的改变(除了指向常量的指针和常引用),具体用法请自行上机尝试一下。

相关主题
文本预览
相关文档 最新文档