目录
一、一维数组
1.数组名
当声明一个数组时,如
int a[10]
此时可知b[0]的类型是整形;而b的类型是指向 int 的指针常量,b指向的是数组第一个元素地址。
指针常量意味着不能更改该常量的值。
当b为一个指针时,下列两表达式含义一样。
b = a;
b = &a[0];
2.数组下标
下标引用一个数组 arry[sub] 与间接访问 *(arry+(sub)) 效果是相同的,但使用下标引用的优先级更高。
除了数组外下标对指针也是可以使用的,当
int arry[10];
int *p = arry + 2;
此时,p[3] 就表示 arry[5]。同时也可用 *(p+3) 来表示。甚至可以使用 p[-1] 表示 arry[1]。
在对指针和下标的使用中,下标绝不会比指针更有效率,但指针可能会比下标更高效。
下面有两个指针的高效用法
//将一个数组清零
int arry[10], *ap;
for(ap = arry; ap < arry + 10; ap++)
*ap = 0;
//将y数组中的值赋给x
#define SIZE 50
int x[SIZE];
int y[SIZE];
void fun(int x[], int const y[])
{
register int *p1, *p2;
for(p1 = x, p2 = y; p1 < x + SIZE;)
*p1++ = *p2++;
}
在声明第二个函数时,如果不想更改y中的值,最稳妥的方法是将其声明为常量。
二、多维数组
如 a[10][20] 就为一个多维数组,可将其理解为长度为10,其中的每个元素都是包含20个元素的数组。
同样,多维数组也可写为间接引用的形式,如 *(*(a+10)+20)。
作为函数参数传递时,多维数组只能采用以下两种形式
void fun(int (*a)[20]);
void fun(int a[][20]);
绝对不能写成 void fun( int **a);
在多维数组中,只有第一维才能根据初始化列表缺省地提供。剩余几个维必须显示地写出。如:
int arr[][5] = {
{00,01,02},
{10,11},
{20,21,22,23}
};
三、指针数组
其作用在于对多个字符串列表,便于查找等等。