对于指针数组和数组指针只看中文名的情况下,我们去记忆理解是比较困难的。但是看英文可能会让人豁然开朗。
- 指针数组:array of pointers,即 “指针的数组”,一个存储指针的数组
- 数组指针:a pointer to an array,即“数组的指针”,一个指向数组的指针
如果这么去理解记忆就太明确了。 下文中我将一直加上“的”表示领属关系。
下面看看他们的用法:
指针的数组:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
int *a[3]; // 声明一个指针的数组
int b[] = {1,2,3};
// 对指针的数组中的数据依次初始化
for (int i = 0; i < 3; i++)
{
a[i]=&b[i];
}
// 打印数据,输出指针的地址、指针指向的地址、指针指向的的值
for (int i = 0; i < 3; i++)
{
// 注意:*a[i] 和 *(a[i])是一样的,因为[]优先级高于*
qDebug() << &a[i] << " : " << a[i] << " : " << *a[i];
}
return app.exec();
}
运行结果:
0x7df530 : 0x7df560 : 1
0x7df538 : 0x7df564 : 2
0x7df540 : 0x7df568 : 3
这个运行结果是在64位机器上运行的指针大小为8字。如果是32位机器指针的大小为4字。
数组的指针:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
int (*a)[3]; // 声明一个数组的指针
int b[] = {1, 2, 3};
a=&b;
// 给指针指向的数据的第3个元素赋值
(*a)[2] = 4;
// 打印数据,输出:指针地址,指针指向的数据的数据
for (int i = 0; i < 3; i++)
{
qDebug() << &a << " : " << (*a)[i];
}
return app.exec();
}
结果:
0x3efc90 : 1
0x3efc90 : 2
0x3efc90 : 4