指针数组与数组指针,一维,二维数组指针

在指针操作过程,当普通变量采用指针访问时,比较简单。

但是在一维,二维数组时,指针的指向就需要认真的分析了。

#include <QtCore/QCoreApplication>
#include<QDebug>

int main(int argc, char* argv[])
{
	QCoreApplication a(argc, argv);

	int iTest001 = 2;
	int iTest002[2] = { 1,2 };


	qDebug() << "iTest002 adress:" << iTest002 << "iTest002[0] adress:" << &iTest002[0] << "iTest002[1] adress:" << &iTest002[1];
	qDebug() << "iTest002[0]:" << iTest002[0] << "iTest002[1]:" << iTest002[1];

	//指针数组,里面存储的是指针
	int* iTest003[2] = {nullptr,nullptr};

	qDebug() << "iTest003 adress:" << iTest003<< "iTest003[0] adress:" << &iTest003[0]<<"iTest003[1] adress:" << &iTest003[1];

	iTest003[0] = &iTest002[0];
	iTest003[1] = &iTest002[1];
	qDebug()  << "iTest003[0]:" << iTest003[0] << "iTest003[1]:" << iTest003[1];

	//定义一个数组的指针,即数组名也就是数组的首地址,相当于是指针的指针
	int(*iTest004)[2];

	//将数组的首地址的地址赋值给指针变量iTest004,
	//*iTest004对应的就是iTest002的值,也即数组的首地址
	//**iTest004也即iTest002[0]对应值
	//*(*iTest004+1)也即iTest002[1]对应值
	iTest004 = &iTest002;

	//iTest004[0]表示一个int[2] 的数组首地址即iTest002[2]的首地址,
	// iTest004[1]表示下一个int[2] 的数组首地址,iTest002的地址+2*sizeof(int)
	//iTest004[2]表示再下一个int[2] 的数组首地址,iTest002的地址+4*sizeof(int)
	//内存泄露风险
	qDebug() << "iTest004[0]:" << iTest004[0] << "iTest004[1]:" << iTest004[1]<<"iTest004[2]:" << iTest004[2];

	//*iTest004对于iTest002[0]的地址,*iTest004+1对于iTest002[1]的地址
	qDebug() << "*iTest004+0:" << *iTest004+0 << "*iTest004+1:" << *iTest004 + 1;

	//**iTest004也即iTest002[0]对应值
	//*(*iTest004+1)也即iTest002[1]对应值
	qDebug() << "*(*iTest004+0):" << *(*iTest004 + 0) << "*(*iTest004+1):" << *(*iTest004 + 1);


	//二维数组
	int iTest005[2][3] = { 1,2,3,4,5,6 };

	//当二维数组时,&iTest005[0]与iTest005[0]都表示0行首地址
	qDebug() << "iTest005 adress:" << iTest005 << "iTest005[0] adress:" << &iTest005[0] << "iTest005[1] adress:" << &iTest005[1];
	qDebug() << "iTest005[0]:" << iTest005[0] << "iTest005[1]:" << iTest005[1];

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			qDebug() << QString("iTest005[%1][%2] adress:").arg(i).arg(j) << &iTest005[i][j];
			qDebug() << QString("iTest005[%1][%2]:").arg(i).arg(j) << iTest005[i][j];
		}
	}

	//定义一个2行三列的数组的指针  等同于**iTest006,所以如果要取值则***iTest006
	int(*iTest006)[2][3] = { nullptr };


	iTest006 = &iTest005;

	//表示整个二维数组类型的指针,内存泄露风险
	qDebug() << "iTest006[0]:" << iTest006[0] << "iTest006[1]:" << iTest006[1] << "iTest006[2]:" << iTest006[2];

	//表示iTest005一行的指针 *iTest006+0等同于 iTest005[0] *iTest006+1等同于 iTest005[1]
	//*iTest006为2维数组,各行的首地址 *iTest006大小为3个int大小
	qDebug() << "*iTest006+0:" << *iTest006 + 0 << "*iTest006+1:" << *iTest006 + 1<<"*iTest006+2:" << *iTest006 + 2;
	
	//同上
	qDebug() << "(*iTest006 + 0)[0]:" << (*iTest006 + 0)[0] << "(*iTest006 + 0)[1]:" << (*iTest006 + 0)[1] << "(*iTest006 + 0)[2]:" << (*iTest006 + 0)[2];

	qDebug() << "*(*iTest006+0):" << *(*iTest006 + 0) << "*(*iTest006+1):" << *(*iTest006 + 1) << "*(*iTest006+2):" << *(*iTest006 + 2);

	//那要遍历二维数组
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			qDebug() << QString("point-iTest006[%1][%2] adress:").arg(i).arg(j) << (*(*iTest006+i)+j);
		    qDebug() << QString("point-iTest006[%1][%2]:").arg(i).arg(j) << *(*(*iTest006 + i) + j);
		}
	}

	//其他二维数组指针定义,采用一维数组定义
	int(*iTest007)[3]{nullptr};
	iTest007= iTest005;

	qDebug() << "*iTest007+0:" << *iTest007 + 0 << "*iTest007+1:" << *iTest007 + 1 << "*iTest007+2:" << *iTest007 + 2;
	
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++)
		{
			qDebug() << QString("point-iTest007[%1][%2] adress:").arg(i).arg(j) << (*(iTest007 + i) + j);
			qDebug() << QString("point-iTest007[%1][%2]:").arg(i).arg(j) << *(*(iTest007 + i) + j);
		}
	}


	return a.exec();
}

 上述代码运行结果

iTest002 adress: 0x6ff874 iTest002[0] adress: 0x6ff874 iTest002[1] adress: 0x6ff878
iTest002[0]: 1 iTest002[1]: 2
iTest003 adress: 0x6ff86c iTest003[0] adress: 0x6ff86c iTest003[1] adress: 0x6ff870
iTest003[0]: 0x6ff874 iTest003[1]: 0x6ff878
iTest004[0]: 0x6ff874 iTest004[1]: 0x6ff87c iTest004[2]: 0x6ff884
*iTest004+0: 0x6ff874 *iTest004+1: 0x6ff878
*(*iTest004+0): 1 *(*iTest004+1): 2
iTest005 adress: 0x6ff8a0 iTest005[0] adress: 0x6ff8a0 iTest005[1] adress: 0x6ff8ac
iTest005[0]: 0x6ff8a0 iTest005[1]: 0x6ff8ac
"iTest005[0][0] adress:" 0x6ff8a0
"iTest005[0][0]:" 1
"iTest005[0][1] adress:" 0x6ff8a4
"iTest005[0][1]:" 2
"iTest005[0][2] adress:" 0x6ff8a8
"iTest005[0][2]:" 3
"iTest005[1][0] adress:" 0x6ff8ac
"iTest005[1][0]:" 4
"iTest005[1][1] adress:" 0x6ff8b0
"iTest005[1][1]:" 5
"iTest005[1][2] adress:" 0x6ff8b4
"iTest005[1][2]:" 6
iTest006[0]: 0x6ff8a0 iTest006[1]: 0x6ff8b8 iTest006[2]: 0x6ff8d0
*iTest006+0: 0x6ff8a0 *iTest006+1: 0x6ff8ac *iTest006+2: 0x6ff8b8
(*iTest006 + 0)[0]: 0x6ff8a0 (*iTest006 + 0)[1]: 0x6ff8ac (*iTest006 + 0)[2]: 0x6ff8b8
*(*iTest006+0): 0x6ff8a0 *(*iTest006+1): 0x6ff8ac *(*iTest006+2): 0x6ff8b8
"point-iTest006[0][0] adress:" 0x6ff8a0
"point-iTest006[0][0]:" 1
"point-iTest006[0][1] adress:" 0x6ff8a4
"point-iTest006[0][1]:" 2
"point-iTest006[0][2] adress:" 0x6ff8a8
"point-iTest006[0][2]:" 3
"point-iTest006[1][0] adress:" 0x6ff8ac
"point-iTest006[1][0]:" 4
"point-iTest006[1][1] adress:" 0x6ff8b0
"point-iTest006[1][1]:" 5
"point-iTest006[1][2] adress:" 0x6ff8b4
"point-iTest006[1][2]:" 6
*iTest007+0: 0x6ff8a0 *iTest007+1: 0x6ff8a4 *iTest007+2: 0x6ff8a8
"point-iTest007[0][0] adress:" 0x6ff8a0
"point-iTest007[0][0]:" 1
"point-iTest007[0][1] adress:" 0x6ff8a4
"point-iTest007[0][1]:" 2
"point-iTest007[0][2] adress:" 0x6ff8a8
"point-iTest007[0][2]:" 3
"point-iTest007[1][0] adress:" 0x6ff8ac
"point-iTest007[1][0]:" 4
"point-iTest007[1][1] adress:" 0x6ff8b0
"point-iTest007[1][1]:" 5
"point-iTest007[1][2] adress:" 0x6ff8b4
"point-iTest007[1][2]:" 6

通过上述结果分析

一维数组指针

int (*Var)[n] 

Var为指针变量, 相当于定义了一个 长度为 n的int数组的指针变量。

这个指针变量所指的地址对应值就是数组的首地址。

所以在取对应数组值时,采用  *(*Var+i)  的方式来取数组值

*Var 取数组首地址, *Var+i 对应数组后续的元素的地址, 则其值为*(*Var+i) 。

二维数组  int demo[n][m]

二维数组指针

int (*Var)[n][m]

Var=&demo 表示demo[n]数组的地址的地址赋值给变量。 即将一个二维数组的指针的指针赋值给一个指针变量。 地址为**Var, 取值为 ***Var

Var为指针变量, 相当于定义了一个 大小为行为n,列为m的的int二维数组的指针变量。

这个指针变量所指的地址对应值就是二维数组的首地址

但是*Var 取数组首地址, *Var+i 对应数组各行元素的首地址,i为行序号

而要取对应行中各列的地址则通过 *(*Var+i)+j  j为列序号。 

通过上述例子,可知(*Var+i),  相当于i行的首地址。*(*Var+i)相当于i行0列的地址,(*Var+i)与*(*Var+i)其实是一个地址。

通过*(*Var+i)+j即获取到i行j列的地址

对应i行,j列值即为*(*(*Var+i)+j)

采用一维数组方式:

int (*Var)[m] 

Var=demo  表示为demo[n]数组的地址赋值给变量。 即将一个二维数组的指针赋值给一个指针变量。 地址为*Var, 取值为 **Var

Var为指针变量, 相当于定义了一个 大小为m的的int一维数组的指针变量。

这个指针变量所指的地址对应值就是二维数组的首行的首地址

可知(Var+i),  相当于i行的首地址。*(Var+i)相当于i行0列的地址,

通过*(Var+i)+j即获取到i行j列的地址

对应i行,j列值即为*(*(Var+i)+j)

比上面二维数组指针少一个*符号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值