c语言传数组实参给函数形参,传的是首地址,那为啥下面用arr[i]还可以访问到数组里面的元素

img

是这样一个问题:看的视频讲的说,不能用sizeof(arr)÷吧啦吧啦等那一句来计算数组的长度,因为传给bubble_sort的是arr数组的首元素地址,用sizeof的话计算的是首元素地址的字节数,那是不是说函数中的arr数组里面就只有一个首元素地址,那为什么后面又可以用arr[i]了呢?不是说里面只有一个首元素地址吗?求帮帮我,我迷糊了。

arr[i]的本质是 *(arr + i)
只要这个数组存在,传入首地址,都可以访问后面的。

很明显不是啊,你没看计算长度是 sizeof(arr) / sizeof(arr[0])
传arr进去,是把数组首地址传进去,但计算的是整个数组所占内存空间的大小;
传arr[0],这是把数组第一个元素值传进去,也就是计算它对应int类型的所占内存空间。
最后两者相除就是数组长度

代码里第7行,得到的只是一个指针的大小值,不是数组的长度值,这行是错误的。
我们知道,数组是内存里一块连续的空间,当我们知道了数组的首地址即数组名,那么它是连续的空间分配,意味着它们的地址是连续的,就可以用 首地址 + 偏移量 得到数组里每个元素所在的地址值,也就可以访问任一元素,arr[i] 就是 *(arr + i),这是数组两种不同形式的写法,实际作用是一样的。