数组指针

本质是指针,指向数组。数组也是有类型的,其类型由元素类型元素个数共同来决定。因此,

int array[5] = {1, 2, 3, 4, 5};
int (*pArray) [5] = &array;  

pArray是一个指针,指向一个具有5个元素,且元素类型为int的array数组。
另外,为了简化写法,C语言还支持使用typedef来为数组类型重命名。前面讲了,数组类型是由元素类型和元素个数共同决定。因此,使用typedef为数组类型重命名的方式如下,

typedef int (AINT5) [5];
typedef float (AFLOAT10) [10];

因此,这个时候,定义数组就变成了,

AINT5 iArray;
AFLOAT10 fArray;

由于有int类型的数据,因此可以定义一个int 的指针;由于有 loat类型的数据,因此可以定义一个float 的指针。现在已经通过typdef为数组类型重命名了,也就是说,获得了数组类型,那么可以定义一个数组指针。

AINT5* pArray = &iArray;

因此,* pArray取得的就是它实际指向的目标iArray。因此,以下两种写法是等价的,

(*pArray)[i] 等价于 iArray[i]

实例代码

typedef float (AFLOAT10) [10];   

AFLOAT10 fArray = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};
AFLOAT10* pf = &fArray;
int i = 0;
for(i = 0; i < 10; ++i){
      printf("%f\n", fArray[i]);
}
i = 0;
for(i = 0; i < 10; ++i){
      printf("%f\n", (*pf)[i]);
}

指针数组

本质是数组,其数组元素为指针。一个char* 指针可以指向一个字符串,那么我有了指针数组后,就可以指向我所需要指向的任意多个字符串。

const char* keyWord[] = {  

      "do",
      "for",
      "if",
      "register",
      "switch"
};

因此,我可以借此实现一个查找关键字功能的函数。

int lookup_keyWord(const char* key, const char* table[], const int size){  
    int ret = -1;
    for(int i = 0; i < size; ++i){
          if(strcmp(key, table[i]) == 0){
              ret = i;
              break;
          }       
    }  
      return ret;
}

这段代码中,函数定义中提供了size变量,那是因为在函数中table会退化成const char** table,因此会丢失数组元素个数信息,因此需要提供一个size信息。那么size怎么得到呢?可以通过定义一个宏,

#defin DIM(arr) sizeof(arr) / sizeof(*arr)

最后,需要注意的是,数组首元素的起始地址数组的的起始地址不是同一个概念。