在指针操作过程,当普通变量采用指针访问时,比较简单。
但是在一维,二维数组时,指针的指向就需要认真的分析了。
#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)
比上面二维数组指针少一个*符号