经过上面的讲解,相信你已经掌握了二维数组在内存里面的布局了。下面就看一个题:
#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 毫米处,这时候指针没有任何内存可用。