在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列 arr 與 &arr[0] 的值是相同的: #include int main(void) { int ...
回C語言目錄
在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列arr與&arr[0]的值是相同的:
#include
intmain(void){
intarr[10]={0};
printf("arr:\t\t%p\n",arr);
printf("&arr[0]:\t%p\n",&arr[0]);
return0;
}
執行結果:
arr:0061FEA8
&arr[0]:0061FEA8
之前也曾經談過,陣列索引其實是相對於首元素位址的位移量,下面這個程式以指標運算與陣列索引操作,顯示出相同的對應位址值:
#include
#defineLEN10
intmain(void){
intarr[LEN]={0};
int*p=arr;
for(inti=0;i
#defineLEN5
intmain(void){
intarr[LEN]={10,20,30,40,50};
int*p=arr;
//以指標方式存取
for(inti=0;i
intmain(void){
intarr[]={10,20,30,40,50};
printf("%p\n",arr);//顯示0061FEBC
printf("%p\n",&arr);//顯示0061FEBC
return0;
}
每個陣列元素的位址型態是int*,這表示對它進行運算時,是以int長度為單位,而arr變數的位址處就是陣列資料的開端,&arr型態會是…呃…int(*)[5],5是陣列長度,如果想宣告相對應的變數,可以如下:
int(*p)[5]=&arr;
int(*)[5]表示,對它進行運算時,是以5個int長度為單位,因此&arr+1的結果,會是陣列使用的空間後之位址,而*(&arr+1)的值型態會回到int*,也就是最後一個元素後之位址,這時就可以與int*的arr進行相減,也就是與第一個元素之位址相減,就可以得到陣列長度了。
舉這個例子的重點之一是,對於同一個位址,指標的型態決定了該怎麼看得相對應相加、相減計算;另一個重點是,透過陣列變數會取得首元素的位址,將陣列變數指定給指標p,就只是取得首元素位址並儲存在p,如果將p傳給sizeof,那使用的會是指標p的型態,而不是原陣列的型態,這會令sizeof、以及方才那神奇計算長度的方式失效,例如:
#include
intmain(void){
intarr[]={10,20,30,40,50};
int*p=arr;
printf("%p\n",p);//顯示0061FEBC
printf("%p\n",&p);//顯示0061FEB8
printf("%d\n",sizeof(p)/sizeof(*p));//顯示1
printf("%d\n",*(&p+1)-p);//顯示-1605549
return0;
}
C++11提供了begin與end函式,可以計算陣列長度:
constexprintLENGTH=5;
intarr[LENGTH]={10,20,30,40,50};
cout<
intmain(void){
intarr[]={10,20,30,40,50};
int*begin=arr;
int*end=*(&arr+1);
for(int*it=begin;it
#defineROWS2
#defineLEN3
intmain(void){
intmaze[ROWS][LEN]={
{1,2,3},
{4,5,6}
};
printf("ROWS:%d\n",sizeof(maze)/sizeof(maze[0]));
printf("LEN:%d\n",sizeof(maze[0])/sizeof(maze[0][0]));
return0;
}
或者是使用以下程式:
#include
#defineROWS2
#defineLEN3
intmain(void){
intmaze[ROWS][LEN]={
{1,2,3},
{4,5,6}
};
printf("ROWS:%d\n",*(&maze+1)-maze);
printf("LEN:%d\n",*(&maze[0]+1)-maze[0]);
return0;
}
執行結果都是:
ROWS:2
LEN:3
〈二維(多維)陣列〉也曾經舉了個例子:
#include
#defineROWS2
#defineLEN3
intmain(void){
intmaze[ROWS][LEN]={
{1,2,3},
{4,5,6}
};
for(inti=0;i
#defineROWS2
#defineLEN3
intmain(void){
introw1[LEN]={1,2,3};
introw2[LEN]={4,5,6};
int*maze[ROWS]={row1,row2};
for(inti=0;i
#defineROWS2
#defineLEN3
intmain(void){
intmaze[ROWS][LEN]={
{1,2,3},
{4,5,6}
};
for(inti=0;i
#defineROWS2
#defineLEN3
intmain(void){
intmaze[ROWS][LEN]={
{1,2,3},
{4,5,6}
};
int(*mazeBegin)[LEN]=maze;
int(*mazeEnd)[LEN]=*(&maze+1);
for(int(*row)[LEN]=mazeBegin;row
#defineROWS2
#defineLEN3
typedefint(*Row)[LEN];
intmain(void){
introw1[LEN]={1,2,3};
introw2[LEN]={4,5,6};
Rowmaze[ROWS]={&row1,&row2};
introws=*(&maze+1)-maze;
for(inti=0;i