數組名是一個指針常量,表示數組第一個元素的的起始地址。
如 int a[5]; a表示數組第一個元素a[0]的起始地址&a[0]。
一 引用數組元素的方法:
①用數組下標引用數組元素
數組a中元素用下標表示為:
a[0] a[1] a[2] a[3] a[4]
②用指針引用數組元素
數組a中元素用下標表示為:
int *p = a;
*p, *(p+1), *(p+2), *(p+3), *(p+4)
二 數組和指針的關系:
①既然p是指向數組第一個元素起始地址的指針,可以用*(p+i)表示數組中第i+1個元素,a也是指向數組第一個元素的指針啊,那么能不能用*(a+i)表示第i+1個元素呢?
可以的,可以用printf 打印 *(a+i)的值驗證
②反過來,a是指向數組第一個元素起始地址的指針,可以用a加數組下標引用數組元素,如a[3],p也是指向數組第一個元素起始地址的指針,能不能用p加數組下標引用數組元素?
也是可以的,可以用printf 打印 p[0], p[1]....的值驗證
PS: 由上得,數組名a和指針p是一樣的。實際上編譯時,數組元素a[i] 就是當作 *(a+i)去處理的,先通過數組名a找到數組的首地址,然后首地址 a+i 得到元素a[i]的地址,
再然后通過*(a+i)得到第i個元素的內容。
所以:數組的第i個元素直接寫成*(a+i)的形式直接取得值,效率不就提升了嗎。省去編譯器先通過數組名a找到數組的首地址,然后首地址 a+i 得到元素a[i]的地址,
再然后通過*(a+i)得到第i個元素的內容。
三 指向數組的指針的自增:
int a[5];
int *p = a;
可以 ++p 遞增指針p指向下一個數組元素,然后用*p取得元素的值。
能不能用a++或者++a把指針指向下一個數組元素? 不能!!! 開頭就說過,數組名是指向數組首元素的指針常量。指針a是不可以指向其他元素的,只能指向首元素的起始地址。
四 數組指針做形參:
把數組從主調函數傳到被調函數時,我們可以傳數組的首地址和數組長度就可以,為什么不是傳遞數組呢?還是為了效率,下面用代碼說明:
void Output(char *p, int len);
int main()
{
char str[] = "HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld ";
Output(str, strlen(str));
system("pause");
return 0;
}
void Output(char *p, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%c", *(p + i));
}
}
如上,如果我們Output函數不是用指針的方式char *p,而是用數組的方式char p[]的話,有什么不一樣?
我們定義的數組str有65字節,調用函數的話會傳遞這65字節的數組。
char *p指針大小是4字節,只需要傳遞4字節的數據就可以了,不止少傳遞數據,執行起來也更快了。
PS: 指針大小可以打印sizeof(int*),sizeof(char*)去驗證。