引用自:http://blog.sina.com.cn/s/blog_6237dcca0100hham.html
博文中博主的字眼有些用的附带个人情感色彩,so,我们阅读的时候不可以囫囵接受。
其中,有些东西不怪解释不清楚, 只能说c中的指针太灵活太灵活。
这里,我想说的就是指针的理解以及“[]”运算符
先说下简单的运算符吧
对于p[i]来说,编译器将这样解释==〉*(p+i*(sizeof(type)))
所以我们如果在运算符左侧放的只能是指针或者起码看起来是指针的东西。
printf("%d", 1[0]); //编译器报错
printf("%d", ((int*)1))[0] //编译器通过
仅此而已。
对于指针,我们这里主要讨论多维指针
其实一个数据是数据还是指令,那要看我们怎么理解了,同理,一个数据是指针还是普通的数值,也是理解方式的问题。
这里多维指针的问题,追根到底,就是编译器的理解问题。
下面用一个小实例来说明下:
int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;
int main()
{
printf("%d %d", p[0], q[0]); //输出结果:1 1
return 0;
}
程序结果说明,对于p和q,我们用相同的方式操作,取得结果 都是一样的。
只不过理解方式不一 样。虽然程序里的p[0]和q[0]都是1,但是,在编译器看来p[0]的类型是int,而q[0]的类型是int*,这里输出的时候不过类型默认转换了一次。
如果我们这样写:
int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;
int main()
{
printf("%d %d", p[0][0], q[0][0]);
return 0;
}
那么编译器会对p[0][0]报错,而q[0][0]则是被编译器通过的,原因就这里不用说了吧。 对于p和q来讲,它们都是普普通通的指针变量而已,只不过是维数不同罢了,简言之,只是编译器对它们的理解不同罢了。
我们对它们操作可以随心所欲的(当然,不能做出让编译器不理解的操作 )。
int a[][2] = {1, 2, 3, 4};
int *p = a;
int **q = a;
int main()
{
printf("%d %d\n", p[0], p[3]);
printf("%d %d\n", q[1], q[2]);
return 0;
}
当然, 对于多维数组,明智的做法是我们定义指针应当指出其低维的维数。例:int a[1][2][3][4] ===〉int (*p)[2][3][4]
这样的话,我们就不用手动的计算多维数组的每一维偏移量了,使用的时候跟直接数组名没什么两样。例:a[0][1][2][3] == p[0][1][2][3]
当然,这只是建议~~
所以结论是:二维数组可以传值给二维指针,但是二维指针不能和二维数组互用。