今天不讨论高大上的东西,真就只说一个小知识点:数组啥时候变指针? 答案是:除了初始化和sizeof之外,一律会变指针。
以一个简单的int型数组为例:
int a[5] = {1, 2, 3, 4, 5};
那么,当我们在程序中使用a时,它的真面目如下:
int a[5] = {1, 2, 3, 4, 5}; // 此时a是数组 sizeof(a); // 此时a是数组
int *p = a+2; // 此时a是指针 function(a, 2); // 此时a是指针 printf("%d\n", a[1]); // 此时a是指针
上面的例子,就是为了重复说明开始第一段的结论而已,再来一遍:除了初始化和sizeof之外,C语言的任何数组都将一律被视为指针来处理。
当然,要补充的一点是:既然数组大多数情况都会被当做指针,那你好歹要说清楚是什么指针呀,是的这非常关键。这个问题的答案是:数组都将一律被视为一个指向其首元素的指针,换句话讲,大多数情况下,数组都等价于其首元素的地址,因此上面的代码完全等价于:
int *p = &a[0]+2; function(&a[0], 2); printf("%d\n", (&a[0])[1]);
最后,诸位看官请注意,以上结论,针对的是任何数组a,并不仅仅是int型数组,甭管是多维数组、指针数组、函数指针数组、数组指针数组…… 不管它有多复杂,结论都是一样的。