C語言自學完備手冊(28)——指標(2)
阿新 • • 發佈:2018-12-16
版權宣告
陣列與指標概述
陣列和指標雖然是不同的東西,但是兩者有著非常緊密的關係。在C語言中:陣列名原則上會被解釋為指向該陣列起始元素的指標。 通俗地來講:陣列名是一個指標,它指向了陣列的起始元素。例如:有一個數組a[5],那麼陣列名a就是一個指標,它指向了該陣列的起始元素。
請看如下示例:
#include <stdio.h> #include <stdlib.h> int main() { int a[5]={1,2,3,4,5}; printf("a=%p\n",a); printf("&a=%p\n",&a); printf("&a[0]=%p\n",&a[0]); return 0; }
結果如下:
a=0060FEFC &a=0060FEFC &a[0]=0060FEFC
從該示例中也可以看:a和&a以及&a[0]的值是一致的,它們均代表了陣列起始元素a[0]的地址。
明白了這一點,我們再來看如下示例:
#include <stdio.h> #include <stdlib.h> int main() { int a[5]={1,2,3,4,5}; int *p; p=&a[0]; printf("&a=%p\n",&a); printf("&a[0]=%p\n",&a[0]); printf("p=%p\n",p); printf("*p=%d\n",*p); printf("a[0]=%d\n",a[0]); return 0; }
在示例中聲明瞭陣列a和指標p,並將&a[0]的值存入p。也就是說:指標p(即p)會被初始化為指向陣列a的起始元素a[0],即p=a[0]。
結果如下:
&a=0060FEF8 &a[0]=0060FEF8 p=0060FEF8 *p=1 a[0]=1
之前我們講解並驗證了:a和&a以及&a[0]的值是一致的,它們均代表了陣列起始元素a[0]的地址。,所以,我們可以優化剛才的示例:
#include <stdio.h> #include <stdlib.h> int main() { int a[5]={1,2,3,4,5}; int *p=a; printf("&a=%p\n",&a); printf("&a[0]=%p\n",&a[0]); printf("p=%p\n",p); printf("*p=%d\n",*p); printf("a[0]=%d\n",a[0]); return 0; }
對比可知:將如下兩句程式碼
int *p;
p=&a[0];
替換成了:
int *p=a;
小結:
陣列名a會被解釋為&a[0],存入p的值為&a[0]的值,即p=&a[0];指標p會被初始化為指向陣列a的起始元素a[0],即*p=a[0]
p+i規則
指標p指向陣列的元素時,遵循以下規則:
- p+i 為指向元素e後第i個元素的指標
- p-i 為指向元素e前第i個元素的指標
今天寫不完了,明天繼續。。。。。。