用二维数组名对二级指针进行赋值后,二级指针的指针运算操作是与二维数组的指针运算有区别的。通过下面的例子你将了解到二维数组与二级指针进行指针运算的本质区别。
char array[3][4]={"January","February","March","April","May","June","July","August","Setember","October","November","December"}; // 定义二维数组
char **p; // 定义二级指针
p=array; // 将二维数组名的值“&array[0]”赋给二级指针变量p
执行p=array操作后,指针变量p的值为“&array[0]”,即array中第一个一维数组的地址。对p进行一次指针运算(*p),得到的值为“January”,而对于二维数组而言,要对array进行两次指针运算(**array)才能得到“January”。
由于&array[0]和&array[0][0]的地址字面上是一样的,对二级指针p进行一次指针运算后,*p的值就是&array[0][0]所指向的字符串“January”,二级指针并没有考虑&array[0]和&array[0][0]的区别;而对二维数组名进行指针运算,*array的值为“&array[0][0]”,再进行第二次指针运算,**array的值为“January”。这样的结果是因为二维数组的特性,即&array[0]指向的是二维数组中的第一行一维数组,&array[0][0]指向的是第一行一维数组中的第一列(个)元素。
总结:即使用二维数组名对二级指针赋值,二级指针在进行指针运算时不会考虑二维数组的特殊性质,对于二级指针来说,&array[0]和&array[0][0]都是指向”January”的地址;而对于二维数组和指向一维数组的指针变量(如“char (*str)[]”)来说,它们进行指针运算时会考虑二维数组的特殊性,&array[0]对他们来说是指向第一行一维数组的地址,&array[0][0]是指向第一行一维数组中的第一个元素的地址。