一、多維數(shù)組地址和指針的關(guān)系int arr2[4][2]={{1,2},{3,4},{5,6},{7,8}};
printf("arr2=%p,&arr2[0]=%p,arr2[0]=%p,&ar2r[0][0]=%p\n",arr2,&arr2[0],arr2[0],&arr2[0][0]);
arr[0][0] (1) |
arr[1][0] (3) |
arr[2][0] (5) |
arr[3][0] (7) |
arr[0][1] (2) |
arr[1][1] (4) |
arr[2][1] (6) |
arr[3][1] (8) |
上面的程序的結(jié)果輸出竟然都一樣。為什么呢?
首先 arr2 代表的是arr2數(shù)組的首地址,所以 arr2的值和 arr2第一個(gè)子元素arr2[0]的地址相同,即 &arr2[0];
arr2[0]是含有兩個(gè)整形元素一維數(shù)組的首地址,即&arr2[0][0]的值。
簡單的說:arr[0]是一個(gè)整數(shù)大小對(duì)象的地址,arr2是兩個(gè)整數(shù)大小對(duì)象的地址。因?yàn)檎麛?shù)和兩個(gè)整數(shù)組成的數(shù)組開始于同一個(gè)地址,所以 arr2 和 arr2[0] 具有相同的數(shù)值。
二、指針(地址)運(yùn)算和多維數(shù)組的關(guān)系printf("arr2+1=%p,arr2[0]+1=%p\n",arr2+1,arr2[0]+1);
現(xiàn)在我們知道,arr2 和 arr2[0]具有相同的數(shù)值,但是arr2+1和arr2[0]+1為什么數(shù)值不一樣呢?這是因?yàn)椋琣rr2指向的對(duì)象大小是兩個(gè)int,兒arr2[0]所指向的大小是一個(gè)int。所以arr2+1的值要比arr2[0]+1的值多一個(gè)int大小。
三、使用*對(duì)多維數(shù)組取值因?yàn)?arr2[0] 是 arr2[0][0]的首地址,所以 *(arr2[0])代表存儲(chǔ)在arr2[0][0]的值。同樣,arr2是arr2[0]的首地址,*arr就是 arr2[0]的值。但是 arr2[0]也是一個(gè)地址,即&arr2[0][0],因此*arr2是 &arr2[0][0]。所以 *&arr2[0][0] 等價(jià)于 **arr2。*&arr2[0][0] 可以簡化為 arr2[0][0]。所以 arr2[0][0]==**arr2。
簡而言之:arr2是地址的地址,所以需要經(jīng)過兩次取值才能取到具體的數(shù)值。
學(xué)完這個(gè)知識(shí)點(diǎn),才發(fā)現(xiàn)在指針確實(shí)很難懂。