回顾一维数组
int a[10];
- 数组名a表示数组的首地址 即a[0]的地址。
- 数组名a是地址常量
- a+i是元素a[i]的地址
- a[i] <=> *(a+i)
二维数组
行指针与列指针
int a[ 3 ] [ 4 ];
- a是数组名,包含三个元素,a[0],a[1],a[2].
- 每个元素a[i], 又是一个一维数组,包含四个元素。
- 二维数组具有二级地址的含义
地址表示的含义:
- a —— 行地址,数组的首地址,第0行的首地址
- a+i——行地址,第i行的首地址
- a[ i ] <=> *(a+i)—— 列地址,第 i 行第0列的元素地址
- a[ i ]+j <=> *(a+i)+j—— 列地址,第i行第j列的元素地址
- *( a[ i ]+j ) <=> ((a+i)+j) <=> a[ i ][ j ] 第i行第j列元素值
行指针
定义形式:数据类型 (* 指针名) [ 一维数组长度 ]; (可以让指针指向二维数组的某一行)
多维数组用指针处理的各种方法
(1)指向数组元素的指针变量(单级间址)
适用于数组连续的存放。
注意 要将第一个元素的地址给指针,而不是把数组名给指针。(二维数组名代表地址的地址)
int *p=&a[0][0];
(2)指向由m个元素组成的一维数组的指针变量(行指针)
int a[2][1]={{1},{2}};
int (*q)[2]=a,i,j;
for(i=0;i<2;i++)
{
for(j=0;j<1;j++)
{
cout<<*(*(q+i)+j)<<endl; //*q永远指向数组a的第一行
}//*(q+i)=q[i]
}
(3)用指针数组处理二位数组
int a[2][1]={{1},{2}};
int *q[2],i,j;
for(i=0;i<2;i++)
{
q[i]=a[i];
for(j=0;j<1;j++)
{
cout<<*(*(q[i]+j))<<endl;
}
}
(4)用指向指针的指针
int a[2][1]={{1},{2}};
int *pn=&a[0][0],**qn=&pn;
for(;pn<=&a[2][1];pn++,qn=&pn)
{
cout<<**qn<<endl;
}
其他指针
const指针
1.指向常量的指针
const 类型名 *指针变量名
eg:
const int a=12;
const int *pa=&a;
2.常指针
指针变量的值是常量,即指针变量的指向不能改变
类型名 *const 指针变量名
说明:必须在定义的时候为其初始化,且不可再改变。
eg:
char *const p="hello!";
空指针
void指针为空指针
void *pa=&a;
引用
对数据的引用就是给一个变量起一个别名
int a;
int &b=a;
注意:
不能对数组进行引用,不能建立引用的引用。