数组指针
为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?
答案与分析:
使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。
定义例子如下: int (*pElement)[2]。
下面是一个例子:
int array[2][3] = {{1,2,3},{4,5,6}}; int (*pa)[3]; //定义一个指向数组的指针 pa = &array[0]; // '&'符号能够体现pa的含义,表示是指向数组的指针 printf ("%d", (*pa)[0]); //将打印array[0][0],即1 pa++; // 猜一猜,它指向谁?array[1]?对了! printf ("%d", (*pa)[0]); // 将打印array[1][0],即4 |
上述这个例子充分说明了数组指针—一种指向整个数组的指针的定义和使用。
需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的,因此,pa++将整个向后移动一个数组的尺寸,而不是仅仅向后移动一个数组元素的尺寸。
指针数组 有如下定义:
struct UT_TEST_STRUCT *pTo[2][MAX_NUM]; |
请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?
答案与分析:
前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢?分析如下:
数组指针是:指向数组的指针,比如 int (*pA)[5]。
指针数组是:指针构成的数组,比如int *pA[5]。
至于上述指针数组的好处,大致有如下两个很普遍的原因:
a)、各个指针内容可以按需要动态生成,避免了空间浪费。
b)、各个指针呈数组形式排列,索引起来非常方便。
在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。
代码:
#include <cstdio>
int _inc(int i) // 用了数组指针 加1操作
{
char (*p)[2] = (char (*)[2])i;
return (int)&((*p)[1]);
}
int main()
{
int r =1;
int *w = &r;
w[0] = 7;
printf("%d\n", w[0]);
char c[2];
c[0] = 'a';
c[1] = 'b';
char (* a)[2] = &c;
printf("%d\n", _inc(2147483646));
return 0;
}