一, 指针
先从变量的地址说起,什么叫变量的地址呢,在C/C++语言中,进行变量说明时,系统将给变量分配对应的存储单元,每个存储单元都有唯一的标明该变量在内存存储位置的首代码,称为变量的即地址(address),用一个十六进制的长整型数表示。
变量的地址是变量在存储单元中的起始位置的编码,那么我们形象的认为是指向该变量,所以又称为指针。注意:取地址运算符“&”代表的是:如果要获取变量的地址,就用该运算符,格式:&变量名。
*与&是互逆运算符,为右结合方式运算,就是从右往左运算。
故而地址值可以存放到变量中,用于存放地址值(指针)的变量称为指针变量。格式:类型 * 指针变量名(类型要与指针变量所指向变量的类型相同)。
注意:1.同一个指针变量可以指向相同数据类型的不同变量;
2.使用指针变量间接访问时,指针变量必须指向一个变量后才能对指针变量指向的对象进行操作;
3.通常情况下,指针变量不要赋值非地址表达式(因为指针变量的运算为内存地址运算,运用不慎可能导致内存泄漏,程序崩溃等情况)
二.引用
而引用呢,也是一种对变量的间接访问,引用也就是变量的别名,其主要用途为:描述函数的参数和返回值,特别是传递较大的数据变量,引用在使用上往往比指针更安全。定义引用时,系统会自动把变量的地址作为引用的地址,使引用与变量有相同的存储单元,对引用的操作相当于对变量的操作,从而实现对变量的间接访问。与指针相比,引用不占用新的地址,节省内存开销,而且隐去了地址操作,从而封锁了对地址的可修改性,更加安全。注意:与取地址运算符格式不同,引用的格式为 &引用名=变量名(间接获取变量名),取地址是 &变量名(直接获取的变量名)。在引用中,&为引用定义符。
三,指针的运算
先举个栗子:
#include <iostream>
using namespace std;
void main()
{
int *p=(int*)0xf40;//将十六进制数转换为地址值 后赋值给指针变量p
cout<<p<<endl;
p=p+4;//p向内存值增加的方向移动4个整型存储单元
cout<<p<<endl;
}
运行一下,得到结果:
0x00000F40
0x00000F50
(即十六进一)。
综上:假定p为指针变量,n为整数,则表达式“p+(-)n”所得到的地址值为:p的原地址值+(-)k.n(k为与p类型相同的存储单元的字节数)
两指针相减:结果为两个指针之间的存储单元个数。
指针的自增自减要注意:(*p)++与++(*p)不是指针的增量运算,而是表示指针变量所指向的存储单元增值1。
另外:*(p++)表示先获取p所指向的存储单元的值,再指向下一个存储单元;
*(++p)表示p先指向下一个存储单元,再获取所指向的存储单元的值。
四,指针与函数
C++中,函数之间的数据传递主要有值传递和地址传递方式,地址传递方式又分为指针方式和引用方式。
当我们开始在不同函数之间传递大量数据时,为了提高效率,减小程序开销,可以采用只传递数据的首地址,而不用传递数据的值(此方法传递的数据是需要存放在一个连续的内存区域中,比如数组)。
(以指针作为函数参数) 如果以指针作为函数的形参,在调用时实参将值传递给形参,也就是使实参和形参指针变量指向同一内存地址,因此在子函数运行时,通过形参指针对数据值的改变也同样影响着实参所指向的数据值,从而实现参数双向传递的目的。
(指针函数)目的:要在函数调用结束时把大量数据从被调用函数返回到主调函数中,而通常非指针型函数在调用结束后只能返回一个值。注意:在调用指针函数时,需要一个同类型的指针变量接受返回的值。格式如下:
数据类型 * 函数名(参数表)
定义:当一个函数声明其返回值为指针类型时,这个函数就称为指针型函数。
(指向函数的指针):调用函数时,编译系统是根据函数名找到函数代码的首地址,从而执行这段代码,其实,函数名就是该函数的代码在内存中的起始地址。函数指针是指向某个函数的指针,用于存放该函数代码首地址的指针变量,可以像使用函数名一样通过指向该函数的指针来调用该函数。格式如下:
数据类型 (*函数指针名)(形参表);
五,指针常量与常量指针
1.指针常量即就是指针值不能被修改的指针,
格式如下:
数据类型 * const 指针名 =变量名; 注意:定义时要出初值,指针的值不允许修改;而指针所指向的对象的值可以被修改。
int a=1;
int b=2;
int * const p=&a;
p=NULL;//错误
*p=b;//正确
2,常量指针
即指向常量的指针变量,格式如下:
const 数据类型 * 指针变量=变量名;
注意:指针指向的对象的值不能被更改,但指针本身可以改变,指向另外的对象,与指针常量相反;
可以将非常量指针赋给一个常量指针,但不能将一个常量指针赋给一个非常量指针,因为const修饰的是指针指向的内容而不是指针的值(地址值)。
3. 指向常量的指针常量(简称常指针常量)
格式如下:
const 数据类型 *const 指针变量=变量名;
通常作为函数形参,以防止函数体内通过形参修改实参所指向的值,以保护实参。