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),也 就是下一個(gè)數(shù)組的首地址,顯然當(dāng)前指針已經(jīng)越過了數(shù)組的界限
(int *)(&a+1): 則是把上一步計(jì)算出來的地址,強(qiáng)制轉(zhuǎn)換為 int * 類型,賦值給 ptr。
*(a+1): a,&a 的值是一樣的,但意思不一樣,a 是數(shù)組首元素的首地址,也就是 a[0]的 首地址,&a 是數(shù)組的首地址,a+1 是數(shù)組下一元素的首地址,即 a[1]的首地址,&a+1 是下一 個(gè)數(shù)組的首地址。所以輸出 2
*(ptr-1): 因?yàn)?ptr 是指向 a[5],并且 ptr 是 int * 類型,所以 *(ptr-1) 是指向 a[4] , 輸出 5。
2、指針數(shù)組和數(shù)組指針
指針數(shù)組:首先它是一個(gè)數(shù)組,數(shù)組的元素都是指針,數(shù)組占多少個(gè)字節(jié)由數(shù)組本身決定。它是“儲(chǔ)存指針的數(shù)組”的簡稱。int p1[10]
數(shù)組指針:首先它是一個(gè)指針,它指向一個(gè)數(shù)組。在 32 位系統(tǒng)下永遠(yuǎn)是占 4 個(gè)字節(jié), 至于它指向的數(shù)組占多少字節(jié),不知道。它是“指向數(shù)組的指針”的簡稱。int (p2)[10]