1. 指標和數組
這個在最初學習C語言時就學過了,在此只是簡單提下。看一段代碼:
#define SIZE 10
int main (void)
{
int a[SIZE],*p,sum;
int i;
p=a;
sum=0;
for(i =0;i<SIZE;i++)
{
a[i]=i+1;
}
for(;p<&a[SIZE];p++)
{
sum+=*p;
}
printf("%d",sum);
}
很簡單的一段代碼,就是通過指標來訪問數組元素,在此只提一點,就是&a[SIZE],雖然a[SIZE]不存在,數組的最後一個元素時a[SIZE-1],但是C編譯器不會對下標進行越界檢查,也就是說a[SIZE]一樣可以訪問,所以我們可以用這樣的方式來終止for迴圈。
另外,面對指標訪問數組還是下標訪問數組,都是圍繞著訪問效率來的。其實這依賴於不同編譯器的具體實現,在C標準中並無提及。
2. 指標與多維陣列
這個在我大學學C語言時,一直都沒有理解,不過現在看來比較容易了。
二維數組實際上在儲存上也是一段連續的記憶體空間,因此我們可以將二維數組當做一維數組來對待,如下面的代碼:
#define ROW 3
#define COL 5
int main (void)
{
int a[ROW][COL],*p,sum;
int i,j;
p=&a[0][0];
sum=0;
for(i =0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
a[i][j]=j+1;
}
}
while(p<=&a[ROW-1][COL-1])
{
sum+=*(p++);
}
printf("%d",sum);
}
但是這樣做看起來可讀性並不好,對於一些老編譯器來說這樣做的效率較高,可是對於現代編譯器來說已經沒有了這樣的優勢。
因此我們一般應該這樣來做,我們知道,對於二維數組來說,例如a[i][j] ,其實a[0]代表的就是第一行的首元素的地址。那麼我們就可以利用這個來訪問多維陣列元素:
#define ROW 3
#define COL 5
int main (void)
{
int a[ROW][COL],*p,sum;
int i,j;
sum=0;
for(i =0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
a[i][j]=j+1;
}
}
for(i=0;i<ROW;i++)
{
for(p=a[i];p<a[i]+COL;p++)
{
sum+=*p;
}
}
printf("%d",sum);
}