c/c++中,普通变量,一维数组和二维数组的指针变量初始化及使用

数组指针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]

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值