1. 程式人生 > >對二維陣列使用指標進行操作的探索(C語言)

對二維陣列使用指標進行操作的探索(C語言)

 1 /*
 2     Name: 對二維陣列使用指標進行操作的探索 
 3     Copyright: 
 4     Author: lingr7
 5     Date: 01/12/18 11:55
 6     Description: 
 7 */
 8 #include<stdio.h>
 9 int main() {
10 
11     int a[2][3] = {{1,2,3},{4,5,6}};
12     int **p = a;/*這一步,將a存放的地址賦值給了p,這一步是的p與a完全等價*/
13     int *p2 = p;/*這一步就將a[0][0]的地址確實地存入了p2,
14 與int *p2 = a;語句完全等價,同時進行了強制轉換*/ 15 16 printf("a[1][2]的值:%d\n", *(p2 + 1*3 + 2));/*對二維陣列訪問成功*/ 17 printf("a[1][2]的值:%d\n", *((int*)p + 1*3 + 2));/*訪問成功*/ 18 printf("a[1][2]的值:%d\n", *((int*)a + 1*3 + 2));/*對二維陣列訪問成功*/ 19 /* 既然(int*)a與 *(int(*)[3])a在這裡是等價的,那麼還是(int*)a更方便一點*/ 20 printf("
a[1][0]的值:%d\n", *(*(int(*)[3])a+1*3+0));/*訪問成功*/ 21 printf("a[1][0]的值:%d\n", *(*(int(*)[3])p+1*3+0));/*訪問成功*/ 22 /*以上能夠正確的訪問二維陣列*/ 23 24 printf("a[1][0]的值:%d\n", *(a+1*3+0));/*這裡因為a的地址的多重性而混亂,必須強制轉換確認 25 a是一個指向整型元素的指標,才能正確使用a裡存放的地址*/ 26 printf("a[1][0]的值:%d\n", *(*(int(*)[3])p+1*3+0));/*p與a的效果完全一樣
*/ 27 /*printf("a[1][0]的值:%d\n", *(*(int*)p+1*3+0));/*編譯不通過*/ 28 printf("a[1][0]的值:%d\n", *((int*)*p+1*3+0));/*操作失敗*/ 29 printf("a[1][0]的值:%d\n", *((int*)(*p)+1*3+0));/*操作失敗*/ 30 printf("a[1][0]的值:%d\n", *(p+1)); 31 printf("*p應該是一個指向指標的指標:%d", *p); 32 printf("\n"); 33 printf("a的地址:%d\n", a); 34 printf("a[0][0]的地址:%d\n",&a[0][0]); 35 printf("a[0][0]的值:%d\n", *p); 36 printf("a[1][2]的值:%d\n", *(p + 1*3 + 2));/*這裡和int *p = a的結果不同*/ 37 printf("a[1][2]的值:%d\n", *p + 1*3 + 2);/*21,這裡應該是5才對啊 38 這裡跟對二維陣列的操作無關,因為*p指向一個指向整型的指標,可是*P移位根本不確定,*P移位後指向什麼東西*/ 39 /*printf("a[1][2]的值:%d\n", *(*p + 1*3 + 2));/*儲存地址為21的東西沒辦法輸出*/ 40 printf("a[0][0]的值:%d\n", *(p+1)); 41 printf("p+1之前:%d\n",p); 42 p++; 43 printf("p+1之後:%d\n",p);/*地址+1,實際上是10進位制加8了,這是因為p是一個指標,+1之後是下一個 44 而p指向一個指標,對p移位所以是下一個儲存地址長度,與p指向的那個指標指向的型別無關*/ 45 46 }