1. 數組指針:指向數組的指針是數組指針
先看下面一段代碼:
#include <stdio.h> int main(void) { int m[10]; printf("m = %p, &m = %p\n", m, &m); printf("m + 1 = %p, &m + 1 = %p\n", m + 1, &m + 1); return 0; }
運行上面的代碼得到的結果如下圖:
上面代碼中&m是指向數組的指針,也就我們說的數組指針,它在m在數值上是完全相等的,都指向的是同一段內存的起始地址。但是它們的類型確是不同的。其中m是 int *型的指針;而&m指向的是int m[10]這樣一個數組,是一個數組指針,因此m + 1 相當於加上 sizeof(int),由上圖可以計算(0x0028FEFC - 0x0028FEF8) = 4; 而&m + 1相當於加上sizeof(int[10]),由上圖中的計算(0x0028FF20 - 0x0028FEF8) = 40。
可以有如下定義:
int (*p)[10] = &m; 這裡p就是一個數組指針,並且這裡(*p)的括號是必須的,()的優先級高於[],因此p首先是一個指針,然後指向的是int [10]的數組。
2. 指針數組:由多個指針組成的數組是指針數組
int *p[10]; 這裡可以和上面數組指針做對比。p首先是一個數組,然後類型是指針,因此p是指針數組(含有10個指針,例如p[0]、p[1]。。。p[9],每個指針的類型為int *),它的每個變量都可以用來存放地址。