数组指针p3指向二维数组后,三种操作数组元素的方式:
(数组指针p3当数组名使用)
p3[i][j]
(*(p3 + i))[j]
*(*(p3+i)+j)
cout << "单独输出某个元素" << endl;
cout << p3[1][2] << endl;
cout << (*(p3+1))[2] << endl;
cout << *(*(p3 + 1)+2) << endl;
cout << "首元素几种形式" << endl;
cout << p3[0][0] << endl;
cout << (*(p3))[0] << endl;
cout << *(*(p3 )) << endl;
cout << **p3<< endl;
对于一维数组,数组名是首元素地址,我称其为:列地址;指针++就是换列,一个一个地访问每列的元素
对于二维数组,数组名则是首行数组地址,每行都是一个一维数组,我称其为:行地址,指针++就是换行,
类型相同原则,指向它的指针也要是数组指针(行指针)即int (*p)[3];p=行地址;
不能是变量指针(列指针),int *p;
*(p+i )=p[i]=a[i]
&a[2]=&(*(a+2))=&(*(p+2))=p+2=a+2
a[2]=*(p+2)=*(a+2)
//行地址,
如二维数组 int a[3][3],
行指针 int (*p)[3]
因为:
a=*(&a)=&(*a)=&(*(a+0))=&(a[0])=&a[0]
a+1=*(&(a+1))=&(*(a+1))=&(a[1])=&a[1]
a+2=*(&(a+2))=&(*(a+2))=&(a[2])=&a[2]
所以:
p=a+0,就是让行指针指向第0行
p=a+1,就是让行指针指向第1行
p=a+2,就是让行指针指向第2行
想要访问第1行的第2个元素(从该行第0个元素开始)怎么弄?
思路:先指向行,再寻找列,确定地址,最后*地址
使p指向第1行:p=a+1
寻找元素所在列地址:p[0]+2 可以写成*(p+0)+2 //本行元素的第2列地址
*地址:*(p[0]+2) 可以写成*(*(p+0)+2)
//列地址,
对于二维数组c[2][3] = { {1,2,3},{4,5,6} };
看作:
数组名为c[0],元素个数为3 的一维数组 c[0]={1,2,3}
数组名为c[1],元素个数为3 的一维数组 c[1]={4,5,6}
一维数组名代表首元素地址,是列地址,那就定义一个指向一维数组的指针(列指针)
int *p4;
p4 = c[0];//指向第一行,是列指针(对比前面一维数组的指针看看)
#include <iostream>
using namespace std;
int main()
{
cout << "对于变量" << endl;
int *p;
int a = 5;
p = &a;//用&取变量地址
cout << "*p=" << *p<<endl;
cout << "对于一维数组" << endl;
int *p1;
int b[3] = {1,2,3};
p1 = b;//数组名代表首元素地址
cout << "*p1=" << *p1 << endl;
for (int i = 0; i < 3; i++)
{
cout << "*p[" <<i<<"]="<< *(p1+i )<<"\t";
}
cout << endl;
for (int i = 0; i < 3; i++)
{
cout << "b[" << i << "]=" << b[i] <<"\t";
}
cout << endl;
for (int i = 0; i < 3; i++)
{
cout << "p[" << i << "]=" << p1[i] <<"\t";//指针名当数组名用
}
cout << endl;
cout << "对于二维数组" << endl;
cout << "方法一:看作单个变量输出二维数组的每个元素" << endl;
int *p2;//这个是指向单个变量的指针
int c[2][3] = { {1,2,3},{4,5,6} };
//p2 = c;//报错!原因见方法二
//p2 = c[0];
p2 = *c;
cout << "二维数组矩阵形式";
for (int i = 0; i < 6; i++)
{
if (i % 3 == 0)//每三个换行,矩阵形式输出
{
cout << endl;
}
cout << *(p2 + i) << "\t";
}
cout << "\n方法二:先确定(用指针指向)行,再访问每行的每列元素,*(p+i )=p[i], (*(p+i))[j]=*( (*(p + i))+j)" << endl;
int (*p3)[3];//指向行的指针,也就是指向一位数组的指针,该数组类型是int,有3个元素(3列)
//p3 = c; //对于二维数组,数组名则是首行一维数组地址
p3 = &c[0];
cout << "输出第0行,第2列的元素" << endl;
cout << "(*p3)[2] ="<< (*p3)[2] <<endl;//(*p3)[2] =(*(p3+0))[2] =p3[0][2]=c[0][0]
cout << "p3[0][2]=" << p3[0][2] << endl;
cout << "c[0][2]=" << c[0][2] << endl;
cout << "输出第1行,第1列的元素" << endl;
cout << "(*(p3+1))[1] =" << (*(p3+1))[1] << endl;//(*(p3+1))[2] =p3[1][1]=c[1][1]
cout << "p3[1][1]=" << p3[1][1] << endl;
cout << "c[1][1]=" << c[1][1] << endl;
cout << "二维数组矩阵形式\n";
for (int i= 0; i < 2; i++)
for (int j = 0; j < 3; j++)
{
cout << (*(p3+i))[j]<<"\t";
if (j == 2) { cout << endl; }
}
cout << "二维数组矩阵形式\n";
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
{
cout <<*( (*(p3 + i))+j)<< "\t";
if (j == 2) { cout << endl; }
}
cout << "第三种方法:把二维数组看作由列数相同的行构成" << endl;
/*对于二维数组c[2][3] = { {1,2,3},{4,5,6} };
看作数组名为c[0],元素个数为3 的一维数组 c[0]={1,2,3}
数组名为c[1],元素个数为3 的一维数组 c[1]={4,5,6}
一维数组名代表首元素地址,是列地址,那就定义一个指向一维数组的指针(列指针)
*/
int *p4;
p4 = c[0];//指向第一行,是列指针(对比前面一维数组的指针看看)
cout <<"输出第一行\n";
for (int i = 0; i < 3; i++)
{
cout << p4[i] << "\t";//输出第一行
}
cout << endl;
p4 = c[1];//重新指向下一行,不能p4+=1;这样是列指针移动,也就是c[0][1],见下方测试
cout << "输出第二行\n";
for (int i = 0; i < 3; i++)
{
cout << p4[i] << "\t";//输出第二行
}
//把上面两句写成循环
cout << "\n二维数组矩阵形式\n";
for (int k=0; k < 2;k++)
for (int i = 0; i < 3; i++)
{
p4 = c[k];
cout << p4[i] << "\t";//输出第一行
if (i == 2) { cout << endl; }
}
//测试,此时p已经指向第二行,执行p4+=1后,不是行指针加1后移到下一行,而是列指针移到第二个元素的位置(地址)
p4 += 1;
cout << *p4 << endl;//*列地址
return 0;
}
运行结果:
对于变量
*p=5
对于一维数组
*p1=1
*p[0]=1 *p[1]=2 *p[2]=3
b[0]=1 b[1]=2 b[2]=3
p[0]=1 p[1]=2 p[2]=3
对于二维数组
方法一:看作单个变量输出二维数组的每个元素
二维数组矩阵形式
1 2 3
4 5 6
方法二:先确定(用指针指向)行,再访问每行的每列元素,*(p+i )=p[i], (*(p+i))[j]=*( (*(p + i))+j)
输出第0行,第2列的元素
(*p3)[2] =3
p3[0][2]=3
c[0][2]=3
输出第1行,第1列的元素
(*(p3+1))[1] =5
p3[1][1]=5
c[1][1]=5
二维数组矩阵形式
1 2 3
4 5 6
二维数组矩阵形式
1 2 3
4 5 6
第三种方法:把二维数组看作由列数相同的行构成
输出第一行
1 2 3
输出第二行
4 5 6
二维数组矩阵形式
1 2 3
4 5 6
5
请按任意键继续. . .
总结:
a[1],a[2]看作是列地址
&列地址=行地址
*行地址=列地址
*列地址=取地址的值
*(p3+1)=p3[1]=a[1]