数组传到函数首元素变化


void bb(int sz,int arr[])
{
    
    int i = 0;
    for (i=0;i<=sz-1;i++)
    {
        int j;
        for (j = 0; j <= sz - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int a = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = a;
            }
        }
    }
}
int main()
{
    int arr[] = {9,8,7,6,5,4,3,2,1,0};
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i;
    bb(sz,arr);
    for (i = 0; i <= sz; i++);
    {
        printf("%d ", &arr[i]);
    }
    return 0;
}

img


为什么arr[]传到函数里面首元素发生变化了,求解答

首先你需要了解数组名是什么。数组名是首元素的地址(存在两个例外)https://blog.csdn.net/m0_64212811/article/details/126200617 你可以下看这篇博客,进一步理解。
知道了数组名是首元素的地址,那么在传参的时候,本质上是传了一个地址。
用指针去接收是没错的,但为什么又可以用数组形式接收呢?你可以这样去理解:我传了一个数组,用一个数组去接收,这样的逻辑没毛病,也没错误。
但你要知道本质,它其实是个地址,那这时候,就不会在关注你数组的大小,你[]中的数字就可以省略,随便写一个数也没有关系。
数组和指针访问方式是打通的,我不在赘述了,都在那个链接中自己看吧

首元素没有发生变化,你那arr是首元素的地址

你的程序里数组越界了,当i=0,j=sz-1-i=sz-1时,arr[j+1]即arr[sz]越界