變量在內存存放是有地址的,數組在內存存放也同樣具有地址。對數組來說,數組名就是數組在內存安放的首地址。指針變量是用於存放變量的地址,可以指向變量,當然也可存放數組的首址或數組元素的地址,這就是說,指針變量可以指向數組或數組元素,對數組而言,數組和數組元素的引用,也同樣可以使用指針變量。下面就分別介紹指針與不同類型的數組。
6.4.1指針與一維數組
假設我們定義一個一維數組,該數組在內存會有系統分配的一個存儲空間,其數組的名字就是數組在內存的首地址。若再定義一個指針變量,並將數組的首址傳給指針變量,則該指針就指向了這個一維數組。我們說數組名是數組的首地址,也就是數組的指針。而定義的指針變量就是指向該數組的指針變量。對一維數組的引用,既可以用傳統的數組元素的下標法,也可使用指針的表示方法。
int a[10],*ptr;/*定義數組與指針變量*/
做賦值操作:
ptr=a;或ptr=&a[0];
則ptr就得到了數組的首址。其中,a是數組的首地址,&a[0]是數組元素a[0]的地址,由於a[0]的地址就是數組的首地址,所以,兩條賦值操作效果完全相同。指針變量ptr就是指向數組a的指針變量。
若ptr指向了一維數組,現在看一下C規定指針對數組的表示方法:
1)ptr+n與a+n表示數組元素a[n]的地址,即&a[n]。對整個a數組來說,共有10個元素,n的取值為0~9,則數組元素的地址就可以表示為ptr+0~ptr+9或a+0~a+9,與&a[0]~&a[9]保持一致。
2)知道了數組元素的地址表示方法,*(ptr+n)和*(a+n)就表示為數組的各元素即等效於a[n]。
3)指向數組的指針變量也可用數組的下標形式表示為ptr[n],其效果相當於*(ptr+n)。
[例6-5]/*以下標法輸入輸出數組各元素。
下面從鍵盤輸入10個數,以數組的不同引用形式輸出數組各元素的值。
#include <stdio.h>
main()
{
int n,a[10],*ptr=a;
for(n=0;n<=9;n++)
scanf("%d",&a[n]);
printf("1------output!\n");
for(n=0;n<=9;n++)
printf("%4d",a[n]);
printf("\n");
}
運行程序:
RUN
1234567890¿
1------output!
1234567890
[例6-6]采用指針變量表示的地址法輸入輸出數組各元素。
#include <stdio.h>
main()
{
int n,a[10],*ptr=a;/*定義時對指針變量初始化*/
for(n=0;n<=9;n++)
scanf("%d",ptr+n);
print f("2------output!\n");
for(n=0;n<=9;n++)
print f("%4d",*(ptr+n));
print f("\n");
}
運行程序:
RUN
1234567890¿
2------output!
1234567890