數組指針和指針數組

數組指針

本質是指針,指向數組。數組也是有類型的,其類型由元素類型元素個數共同來決定。所以, 數組

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

pArray是一個指針,指向一個具備5個元素,且元素類型爲int的array數組。
另外,爲了簡化寫法,C語言還支持使用typedef來爲數組類型重命名。前面講了,數組類型是由元素類型和元素個數共同決定。所以,使用typedef爲數組類型重命名的方式以下, ide

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

所以,這個時候,定義數組就變成了, 函數

AINT5 iArray;
AFLOAT10 fArray;

因爲有int類型的數據,所以能夠定義一個int 的指針;因爲有 loat類型的數據,所以能夠定義一個float 的指針。如今已經經過typdef爲數組類型重命名了,也就是說,得到了數組類型,那麼能夠定義一個數組指針。 指針

AINT5* pArray = &iArray;

所以,* pArray取得的就是它實際指向的目標iArray。所以,如下兩種寫法是等價的, code

(*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"
};

所以,我能夠藉此實現一個查找關鍵字功能的函數。 it

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怎麼獲得呢?能夠經過定義一個宏, table

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

最後,須要注意的是,數組首元素的起始地址數組的的起始地址不是同一個概念。class

相關文章
相關標籤/搜索