指针(二)
上次對指針進行了初步認識,接下來,繼續挖掘C語言的魂! 指針與一維數組: 這時編譯是沒有問題的: 編譯: 輸出結果: 這里面會有點繞,但很重要,先運行一段程序,再來闡述上面的觀點: #include <stdio.h>int main(void)
{int a[] = {1, 2, 3, 4, 5};int* p = a;printf("%p\n", a);printf("%p\n", &a);printf("%p\n", a+1);printf("%p\n", &a+1);return 0;
}
運行結果:
結果 a+1 和 &a+1 輸出不一樣,這時怎么回事呢,且聽我慢慢分析:
因為a表示int*,是一個int類型的指針,所以a+1偏移的是一個元素是一個int類型,既4個字節,所以0xbff7f218 + 0x4變成了0xbff7f22c。
而&a表示指向數據變量的指針(數組指針),所以&a+1偏移的一個元素是一個數組int[5]類型,既20個字節: 所以0xbff7f218 + 0x14變成了9xbff2f22c
記住:上面提到了數組指針,下面對其進行一個介紹,注意下面兩個區別: 數組指針: int (*p)[5] 這里的p是一個指針,指向一個具有5個元素的數組指針 指針數組: int *p[5] 這里的p是一個數組,數組中的元素類型是int* 接著用程序驗證一下上面指出的理論: 編譯一下,出錯了: 再改編一下: 這時編譯,則成功了: 注意以下意圖表示“數組指針”的方法: 編譯: 理解了上面的東西,下面以一個例子,以多種方式來打印數組的元素(理解這段程序的前提,需理解上面所學到的): #include <stdio.h>int main(void) {int a[5] = {1, 2, 3, 4, 5};int i;int* p;for (i=0; i<5; i++){printf("a[%d]=%d, *(a+%d)=%d\n", i, a[i], i, *(a+i));printf("&a[%d]=%p, a+%d=%p\n", i, &a[i], i, a+i);}//以指針的方式打印元素for (p=a; p<a+5; p++){printf("address:%p, value:%d\n", p, *p);}return 0; }輸出結果:
指針與二維數組: 這里面比較繞,一一分析來理解: (回顧) 對于一維數組int a[3]; 數組名a可以看成是一個常量指針,類型相當于int*,也就是一個整型指針。 對于二維數組int a[3][4]: 數組名a可以看成是一個常量指針,類型相當于int (*p)[4],也就是數組指針。 而a[2]的類型是int*;a[2] + 2仍然是一個指針。 所以*(a[2] + 2)的類型就是一個int類型。 對于上圖中的表示方法有很多,理解性去記性。 下面通過一個例子,來綜合使用二維數組的用法: #include <stdio.h>int main(void) {int a[4][3] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}};int (*p)[3] = a;int i, j;//打印第一行的元素for (i=0, j=0; j<3; j++){printf("%d\t", *(*p+j));}putchar('\n');//打印第二行的元素for (i=1, j=0; j<3; j++){printf("%d\t", *(p[i]+j));}putchar('\n');//打印第三行的元素for (i=2, j=0; j<3; j++){printf("%d\t", (*(p+i))[j]);}putchar('\n');//打印第四行的元素for (i=3, j=0; j<3; j++){printf("%d\t", *(&p[0][0]+i*3+j));}putchar('\n');//打印第四行的元素,變形for (i=3, j=0; j<3; j++){printf("%d\t", (&p[0][0])[i*3+j]);}putchar('\n');return 0; }運行結果:
為了更好的理解二維數組,下面用程序來分解下: 看運行結果: 也就是:0xbff31ccc + 0xc = 0xbff31cd8 好了,關于指針與數組這一塊的內容就學到這,下回繼續探索指針!!轉載于:https://www.cnblogs.com/webor2006/p/3463918.html
總結
- 上一篇: JMF天昏地暗之路(一)-----jmf
- 下一篇: 转载ASP.NET MVC 中@Html