c/c++ 指针

地址

定义变量时,系统会为变量分配内存(常量,包括字面常量和字符常量,不会被分配内存)。每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了一个变量在内存中的位置。如:

int a=1;
cout<<&a<<endl; //输出变量a在内存中的地址

指针

指针是一个变量,其值为另一个变量的地址(或者说,它指向另一个变量),即,内存位置的直接地址。声明方式:

type *varname;

type指数据类型,varname是变量名称,* 指定该变量是指针类型。

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

 

初始化

声明一个指针变量后可以将一个内存地址赋值给它来进行初始化。这个地址可以是变量的地址,也可以是数组的数组名(数组名即数组的首地址),还可以是一个字符串(将一个字符串赋值给指针变量时,其实是把字符串的首地址赋值给它)。需注意,普通指针变量不可以指向常变量,即不可以用常变量的地址对普通的指针变量初始化。

type varname;
type *p;
p=&varname;

比如:int *p=&a; 指针变量 p 的值为 &a,是整型变量 a 的内存地址。指针变量指向的值 *p 为 a,是一个整型变量 a 的数值。

 

常量指针

即指向“常量”的指针变量。定义指针变量的时候,数据类型前要用 const 关键字修饰。常量指针既可以指向常变量,也可以指向普通变量。只是指向的内存不可以通过指针改写存储的值(即使是指向普通变量,但可以通过变量本身进行修改),只能读。需要注意的是 ,常量指针并不是说指针是常量,而是指针指向的变量不可以通过指针来修改,指针本身的指向是可以改变的(即指针变量可以重新被赋值)。

const type varname;   //也可以写成 type const varname; 两种写法等价。
type varname1;
const type *p;  //同样的,也可以写成 type const *p;
p=&varname;  //指针指向常变量
p=&varname1;  //指针重新指向普通变量

 

指针常量(可以理解为指针常变量)

相对与指针变量而言,即指针指向的地址不可改变,初始化之后不可重新被赋值,但指向的内存可以通过指针读写。定义指针常量的时候,指针运算符 * 和指针变量中间要用 const 关键字修饰。需注意,指针常量也不可以指向常变量,即不可以用常变量的地址对指针常量初始化。

type varname;
type * const p;
p=&varname;  //此指针不可以重新被赋值

值得注意的是,数组名对应一个指针常量,不可以改变指向。

 

常指针常量(常量指针和指针常量的结合体)

数据类型前面以及指针运算符 * 和指针变量中间同时需要用 const 关键字修饰。

const type varname;
const type * const p;
p=&varname;  //此指针不可以重新被赋值,也不可以通过该指针改写指向内存的值。

 

NULL指针

声明指针变量的时候,如果没有确切的地址可以赋值,可以为指针变量赋一个 NULL 值,即空指针。这样可以防止在程序中误用未初始化的指针,很多时候,未初始化的变量存有一些垃圾值,导致程序难以调试。

 

双重指针

即指向指针变量的指针变量。声明双重指针时需要在变量名前使用两个 *

int a;
int *q=&a;
int **p=&q;
cout<<**p<<endl; //输出结果为a的值。

利用指针变量访问另一个变量就是“间接访问”。如果一个指针变量中存放一个目标变量的地址,这就是“单级间址”。指向指针数据的指针是“二级间址”。间址的方法可以延伸到更多的级,即多重指针,但实际上在程序中很少超过二级间址,级数越多越难理解,易产生混乱,出错机会多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值