C语言(数组啥时候变指针)

今天不讨论高大上的东西,真就只说一个小知识点:数组啥时候变指针? 答案是:除了初始化和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型数组,甭管是多维数组、指针数组、函数指针数组、数组指针数组…… 不管它有多复杂,结论都是一样的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章