1、a和&a的區(qū)別
void main()
{
int a[5]={1,2,3,4,5};
int ptr=(int )(&a+1);
printf("%d,%d",(a+1),(ptr-1));
}
&a + 1: 取數(shù)組 a 的首地址减拭,該地址的值加上 sizeof(a) 的值,即 &a + 5*sizeof(int)西土,也 就是下一個數(shù)組的首地址动猬,顯然當前指針已經越過了數(shù)組的界限
(int *)(&a+1): 則是把上一步計算出來的地址,強制轉換為 int * 類型焚鲜,賦值給 ptr垦页。
*(a+1): a,&a 的值是一樣的雀费,但意思不一樣,a 是數(shù)組首元素的首地址痊焊,也就是 a[0]的 首地址盏袄,&a 是數(shù)組的首地址,a+1 是數(shù)組下一元素的首地址薄啥,即 a[1]的首地址,&a+1 是下一 個數(shù)組的首地址辕羽。所以輸出 2
*(ptr-1): 因為 ptr 是指向 a[5],并且 ptr 是 int * 類型垄惧,所以 *(ptr-1) 是指向 a[4] 刁愿, 輸出 5。
2到逊、指針數(shù)組和數(shù)組指針
指針數(shù)組:首先它是一個數(shù)組铣口,數(shù)組的元素都是指針,數(shù)組占多少個字節(jié)由數(shù)組本身決定蕾管。它是“儲存指針的數(shù)組”的簡稱枷踏。int p1[10]
數(shù)組指針:首先它是一個指針菩暗,它指向一個數(shù)組掰曾。在 32 位系統(tǒng)下永遠是占 4 個字節(jié), 至于它指向的數(shù)組占多少字節(jié)停团,不知道旷坦。它是“指向數(shù)組的指針”的簡稱。int (p2)[10]