int array[10];
int *p;然後令:
p = array;
#include int結果如下:main();
int *p =array;
for(int i=0;i<10;i++)
printf("\n
");for(int i=0;i<10;i++)
printf("\n
");for(int i=0;i<10;i++)
printf("\n
");for(int i=0;i<10;i++)
printf("\n
");return0;
}
但是如果我們定義乙個多維陣列,如:
int arrays[2][2];
int *p;這樣p就指向了該多維陣列的首位址,由於多維陣列其實是陣列的陣列,所以多維陣列的首位址就是乙個地位的陣列的首位址,即arrays[0],它是乙個有2個元素的陣列。因此我們可以將一維陣列名賦值給int*型的指標,p = arrays;
#include int結果如下:main();
int *p =arrays;
for(int i=0;i<4;i++)
printf("\n
");return0;
}
可以發現,編譯時發生警告:
我們之所以可以通過p來遍歷arrays中所有元素,是因為,陣列本質上是按行優先儲存的。
我們可以通過兩次解引用獲取到陣列中的某乙個元素的值,有下式成立:
**arrays == *&arrays[0][0] == arrays[0][0]如:
#include int結果:main();
int *p =arrays;
printf(
"%d == %d == %d\n
",**arrays,*&arrays[0][0],arrays[0][0
]);
return0;
}
對於多維陣列我們可以定義乙個指向多維陣列的指標:
int (*p)[2];這個括號是一定要加的,因為的優先順序比較高(?)。p = arrays;
比較 int *p[2] 和 int (*p)[2] :
因此我們知道 int (*p)[2] 與arrays有同樣的陣列結構,p就是arrays的乙個別名,我們可以通過p來實現任何arrays能實現的操作:
#include int結果如下:main();
int (*p)[3] =arrays;
for(int i=0;i<2;i++)
printf("\n
");}
return0;
}
陣列名和指標之間,經常會交替使用這兩個變數,例如把乙個指標當成陣列來使用,或者是把陣列名賦值給指標,通過指標來訪問陣列成員變數。
但是,陣列名和指標畢竟是定義不同的變數,它們之間也有一定的區別和聯絡。
理解陣列名和指標的區別和聯絡有助於我們正確使用c語言,即什麼情況下該使用陣列名,什麼情況下該使用指標。
區別1:
1)對於陣列名:
#include int輸出結果如下:main();
printf(
"array = 0x%x\n
",array);
printf(
"&array[0] = 0x%x\n
",&array[0
]); printf(
"&array = 0x%x\n
",&array);
return0;
}
我們已經知道,陣列名即陣列首元素的位址,因此array和&array[0]的值一樣,但是令我們驚奇的是,陣列名的位址&array和和陣列首元素的位址&array[0]也一樣。
2)對於指標:
#include int結果如下:main();
int *p =array;
printf(
"array = 0x%x\n
",array);
printf(
"&array[0] = 0x%x\n
",&array[0
]); printf(
"&array = 0x%x\n
",&array);
printf(
"\np = 0x%x\n
",p);
printf(
"&p = 0x%x\n
",&p);
return0;
}
可以發現指標的值和指標所在的位址是不同的。
區別2:
陣列名是指標常量,指標是指標變數。
區別3:
當對陣列名使用sizeof時,得到的是陣列所有元素所佔的位元組數,對指標sizeof得到的是指標型別的位元組數。
#include int輸出如下:main();
int *p =array;
printf(
"sizeof array = %d bytes\n
",sizeof
(array));
printf(
"sizeof pointer = %d bytes\n
",sizeof
(p));
return0;
}
區別4:
對陣列名取&和對指標取&的意義不同。
#include int輸出如下:main();
int *p =array;
printf(
"&array = 0x%x\n
",&array);
printf(
"&array + 1 = 0x%x\n\n
",&array + 1
); printf(
"&p = 0x%x\n
",&p);
printf(
"&p + 1 = 0x%x\n
",&p + 1
);
return0;
}
上圖可以看到對array取位址後加一,增大了24個位元組,恰好是陣列的大小;而對指標p取位址後加一,只增大了8個位元組,恰好是乙個指標型別所佔的位元組數。
陣列名代表了乙個指向陣列首元素的指標常量,一經定義,不可更改;指標是指標變數,定義之後仍可更改,其型別在定義時確定。
當出現 sizeof 和 & 操作符時,陣列名不再當成指向乙個元素的指標常量來使用,而指標仍當成指向乙個元素的指標變數來使用。
對於使用指標和陣列下標的選擇: 系統在使用陣列下標對數組成員變數進行訪問時,開銷比較大,指標的訪問效率是遠遠大於陣列名的訪問效率的;
但是只有在指標正確訪問時,使用指標才比下標法更有效率;
下標法更加容易理解,在可讀性方面,也更加的具有優勢。
C C C語言陣列名與指標
int array 10 int p 然後令 p array include int main int p array for int i 0 i 10 i printf n for int i 0 i 10 i printf n for int i 0 i 10 i printf n for in...
C語言 陣列名與指標
以下內容 感覺對自己有用,收藏了。如果 請註明如上出處。多謝!看到一篇關於c語言指標的文章,正好最近在看 c和指標 就去看了一下。一道 c 語言指標訪存題目的引申 裡面的第乙個題目就把我難住了。幫助123456789 include int main int pa int a 1 printf x ...
陣列名與指標
引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...