C++关键点总结系列-5

数组、指针和引用

数组

      构造型(组合型)数据类型

      有一定顺序关系的若干相同类型变量的集合体

      数组类型与数组元素类型相同。数组元素在内存中顺次存放、地址连续

      可用下标访问

      一维二维和多维

如不初始化,Auto数组存在垃圾数据,static默认初始化为0

部分初始化,其他默认为0

 

指针

指针是内存地址,用于间接访问内存单元

指针变量是存放内存地址的变量

定义: 存储类别 数据类型 *指针变量名  指针变量是p,不是*p

存储类别:extern/static/auto

数据类型:int/float/char/double,也可以是数组、指针

指针的数据类型:指针指向的变量的数据类型

指针变量本身的数据类型:unsigned long int无符号长整型

 

指针也有全局变量、局部变量、静态局部变量和静态全局变量,必须初始化

static int i;

static int* ptr = &i;


*ptr = 3;

 

 

•    有一个指针px ,

•    px  — 指针变量,它的内容是地址量。

•    *px— 指针的目标变量,它的内容是数据。

•    &px — 指针变量占用的存储区域的地址。

存储类型 数据类型 *指针名=初始地址;

•    例如:int *pa = &a;

const指针

1)关键字const放在指针类型前,就是声明一个指向常量的指针变量。此时,在程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。

     格式:const  类型名  *指针变量名

int a;

const int *p1 = &a; //p1是指向常量的指针

int b;

p1 = &b; //正确,p1本身的值可以改变

*p1 = 1; //编译时出错,不能通过p1改变所指的对象

 

 

(2)关键字const放在“*”号和指针名之间,就是声明一个指针常量(也称常指针)。因此,指针本身的值不可改变,也即它不能再指向其他数据,但它所指向的数据的值可以改变。

     格式:类型名  *const 指针变量名

 

int a;

int * const p2 = &a;

p2 = &b; //错误,p2是指针常量,值不能改变

 

 

 

(3)关键字const在上述两个地方都加,则是声明一个指向常量的指针常量(指向常量的常指针),指针本身的值不可改变,它所指向的数据的值也不能通过指针改变。

    格式: *const 类型名 *const 指针变量名

 


 

对于某种数据类型的指针p来说:

p+ n的实际操作是:(p+n*sizeof(数据类型);

p - n的实际操作是:(p -n*sizeof(数据类型);

其中,(p)表示指针p中的地址值,而不是&p,sizeof(数据类型)的长度单位为字节。

 

px-py运算的结果值是两指针指向的地址位置之间的数据个数。

两指针相减实质上也是地址计算。它执行的运算不是两指针存储的地址值相减,而是按下列公式得出结果:          ((px)-(py))/数据长度

其中,(px)和(py)分别表示指针px和py的地址值,所以,两指针相减的结果值不是地址量,而是一个整数。

 

 

如有下面的变量定义:

      int a[10];

      int *p=a;

当需要使用第i个元素中的值时,可以用以下任何一种(四种等价):

      a[i]*(a+i)*(p+i) p[i]

当需要使用第i个元素中的地址时,可以用以下任何一种(四种等价):

      &a[i]a+i p+i  &p[i]

 

二维数组

*(a+1)代表a[1]*(a[0]+1)代表数组元素a[0][1]

 

地址法

对于二维数组中的元素a[i][j]有多种访问方法。以下是其中的一部分:

假设定义了一个二维数组:int a[2][3];则对它的访问方法有:

      *(*(a+i)+j)

      *(a[i]+j)

      (*(a+i))[j]

      *(*a+3*i+j)  //针对int a[2][3]数组

 

指针法

若有语句:int a[2][3],(*p)[3];

p是一个指针变量,它指向包含三个整型元素的一维数组,即行指针。

若有语句:p=a,则二维数组元素a[i][j]的引用形式还可表示为:

      *(*(p+i)+j)

      *(p[i]+j)

      (*(p+i))[j]

      *(*p+3*i+j)//针对int a[2][3]数组

      p[i][j]

 

 

 

指针数组:指针数组的元素是指针型

指针函数:int *fun(int a,int b)

函数fun返回一个指针值,这个指针指向一个整型数据,a、b是形参。

 

函数指针:int (*p)(int,int);

定义了一个函数指针p,它指向一个返回整型值,有两个整型参数的函数。

在定义了指向函数的指针变量后,在使用此函数指针之前,必须先给它赋值,使它指向一个函数的入口地址。由于函数名是函数在内存中的首地址,因此可以赋给函数指针变量。赋值的一般语法格式为:

函数指针名=函数名;

例如,对上面刚定义的函数指针p,可以给它赋值如下:

      p=func1;     //正确

其中,函数名所代表的函数必须是一个已经定义过的,和函数指针具有相同返回类型的函数。并且等号后面只需写函数名而不要写参数,例如不能写成下列形式:

      p=func1(a, b);  //错误

指针对象

this指针

 

引用

为某个变量或隐含的临时变量起个别名,对别名的操作等同于对目标变量的操作。不是变量,其本身不占存储空间,必须初始化

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值