int
a[10][20],*p=a[0]
二维数组本来就是以为数组,二级指针是指针的指针,不同概念
char
*a[]={"a","b"}
char
**p=a
这里定义了一个指针数组,里面保存了两个地址,一个是字符串a的首地址,一个是字符串b的首地址,然后数组的首地址a,这样用一个二级指针才能访问,这就是所谓的指针的指针
int
a[2][2]={1,2,3,4}
int
(*p)[2]=a
(*p)[2]的意思是,p是一个指针变量,只想一个有两个元素的一位数组,这不刚刚就是二维数组的首地址吗?所以这个(*p)[2]是可以指向二维数组首地址
*p[2]的意思是,定义一个数组,里面有两个指针元素,这和"[]","*"运算符优先级有关的
解释如下:指针的本质其实就是地址,我们常说的指针哪,一般都是指的指针变量,就是存放地址的变量。
二级指针,就是指向指针的指针,举例说明:
char ch='A' //定义了一个char型变量ch,并初始化
char *p //定义了一个char型指针变量p
char **pp //定义了一个char型二级指针变量pp
p=&ch //把变量ch的地址赋值给p,那么p就指向了变量ch了。
pp=&p //把指针变量p的地址赋值给pp,那么pp就指向了指针p了。
因为指针变量,它有自己的内存空间,所有的指针类型的变量都是4个字节的大小,即存放的
是一个32位的地址值。
二级指针和二级地址的本质含义是一样的,指针一般是认为是指针变量的,其值是可变的;而地址,我们
通常认为它是一个常量值,是不变的。
平常地址与指针,一样的理解,本质是一样的,都是地址。我们说地址,比如说我定义了一个变量a,
那么这个变量a的地址&a,在编译阶段它的值就已经确定了,是不变的了。而对于指针变量p,它可以
存放变量a的地址&a,也可以存放变量b的地址&b,它的值是可变的,所以我们就把这样的变量就
就做指针。
总而言之,指针和地址,本质是一样的,只是两种不同的叫法而已。
book,book+1这是二级指针,指向储存每本书的书名,作者等信息的数组的首地址;
*(book),*(book)+1是一级指针,分别指向第1本书的书名、作者信息
如图所示:
相当于一维数组的数据成员是每本书的书名等信息,二维数组的数据成员是前面的一维数组。