1.陣列指標:即指向陣列的指標
那麼, 如何宣告乙個陣列指標呢?
int (* p)[10]; /*括號是必須寫的,不然就是指標陣列;10是陣列的大小*/
拓展:有指標型別元素的陣列稱為指標陣列。
2.通過指標引用陣列元素的基本方法
(1)小標法:a[i]。
(2)指標法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是陣列名,p=a,即p指向陣列a首元素的位址。
問:為什麼* (a+i) 和* (p+i)是等價的,或者說是引用的同乙個陣列元素呢?
答:在c語言中,陣列名代表的是陣列中首元素的位址。在程式編譯時,a[i]是按*(a+i)處理的,即按陣列元素的首位址加上相應位移量i找到新元素的位址。而p=a,即p是指向陣列a的首元素的位址,因此是等價的。從這裡可以看出,[ ]實際上是變位址運算子,即將a[i]按a+i計算位址,然後找此位址單元中的值。
問:為什麼p[i] 和* (p+i)是等價的,或者說是引用的同乙個陣列元素呢?
答:c語言規定,當指標變數指向數字元素時,指標變數可以帶下標。而在程式編譯時,對此下標處理的方法是轉換為位址,即對p[i] 處理成 (p+i)。同上,[ ]是變址運算子。
3.利用指標引用陣列元素
(1)p++; *p;
(2)*p++;
等價於*(p++);
因為++和*的優先順序一樣,故結合方向是從右向左。
(3)*(p++);和*(++p);
二者是有區別的。前者是先取*p的值,然後p加1;後者是先p加1,再取p的值。即如果p指向的是陣列a元素a[0],則前者得到a[0]的值,後者得到a[1]的值。
(4)++(*p);
將p指向的元素的值加1。
(5)如果p指向元素a[i],
*(p--);
先得到p指向的位址的元素a[i],然後p減1。
*(++p);執行結果得到a[i+1],p加1。
*(–p);執行結果得到a[i-1],p減1。
4.利用指標輸出陣列元素
int a[10];
int * p;
p = a;
while(p10)
printf("%d",*p++);
或
int a[10];
int * p;
p = a;
while(p10)
或
int a[10];
int * p;
p = a;
for(i=0;i<10;i++)
printf("%d",*p++);
或
int a[10];
int * p;
for(p=a;p10;p++) /*比較專業的寫法,**簡潔、高效*/
printf("%d",*p);
思考:下面**能不能正確輸出陣列元素的值呢?
int a[10];
int * p;
for(p=a;p10;a++)
printf("%d",*a);
因此,結合動態分配陣列,我們可以建立乙個一維的陣列指標:
int (* array)[n]=(int *)malloc(n*sizeof(int));
通過指標引用陣列
為了說清楚什麼是指標,必須先弄清楚資料在記憶體中是如何儲存的,又是如何讀取的。如果在程式中定義了乙個變數,在對程式進行編譯時,系統就會給這個變數分配記憶體單元。編譯系統根據程式中定義的變數型別,分配一定長度的空間。例如,visual c 為整型變數分配4個位元組,對單精度浮點型變數分配4個位元組。記...
通過指標引用陣列元素
通過指標應用陣列元素 1 下標法,如a i 形式 2 指標法,如 a i 或 p i 其中a是陣列名,p是指向陣列元素的指標變數,其初值p a 例如 有乙個整數陣列a,有10個元素,要求輸出陣列中的全部元素。1 下標法。includeint main 2 通過陣列名計算陣列元素位址,找出元素的值。i...
C語言 指標陣列和指標陣列
本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...