經過上面的講解,相信你已經掌握了二維數組在記憶體裡面的布局了。下面就看一個題:
#include <stdio.h>
intmain(int argc,char * argv[])
{
int a [3][2]={(0,1),(2,3),(4,5)};
int *p;
p=a [0];
printf("%d",p[0]);
}
問列印出來的結果是多少。
很多人都覺得這太簡單了,很快就能把答案告訴我:0。不過很可惜,錯了。答案應該是1。如果你也認為是0,那你實在應該好好看看這個題。花括弧裡面嵌套的是小括弧,而不是花括弧。這裡是花括弧裡面嵌套了逗號運算式。其實這個賦值就相當於
int a [3][2]={ 1, 3,5};
所以,在初始化二維數組的時候一定要注意,別不小心把應該用的花括弧寫成小括弧
了。
3、&p[4][2] - &a[4][2]的值為多少。
上面的問題似乎還比較好理解,下面再看一個例子:
int a[5][5];
int (*p)[4];
p = a;
問&p[4][2] - &a[4][2]的值為多少。
這個問題似乎非常簡單,但是幾乎沒有人答對了。我們可以先寫代碼測試一下其值,然後分析一下到底是為什麼。在Visual C++6.0 裡,測試代碼如下:
intmain()
{
int a[5][5];
int (*p)[4];
p = a;
printf("a_ptr=%#p,p_ptr=%#p\n",&a[4][2],&p[4][2]);
printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
return 0;
}
經過測試,可知&p[4][2] - &a[4][2]的值為-4。這到底是為什麼呢。下面我們就來分析一下:前面我們講過,當數組名a 作為右值時,代表的是數組首元素的首地址。這裡的a 為二維數組,我們把數組a 看作是包含5 個int 類型元素的一維數組,裡面再儲存了一個一維數組。
它與一級指標不同的是,一級指標儲存的是資料的地址,二級指標儲存的是一級指標的地址。下圖協助理解: 我們試著給變數p 初始化:
A)
p = NULL;
B)
char *p2; p = &p2;
任何指標變數都可以被初始化為NULL(注意是NULL,不是NUL,更不是null),二級指標也不例外。也就是說把指標指向數組的零地址。聯想到前面我們把尺子比作記憶體,如果把記憶體初始化為NULL,就相當於把指標指向尺子上0 毫米處,這時候指標沒有任何記憶體可用。