首頁  >  問答  >  主體

c/c++中改变子函数里调用的主函数中的数组的值,主函数中的数组本身会变吗?

函数举例如下:

void test(float L[25][30])
{
    for (int i = 0; i < 25; i++)
        for (int j = 0; j < 30; j++)
            L[i][j] = L[i][j] + 1;//简单测试
}
int main()
{
    float L[25][30];
    L[i][j]=......
    ...
    test(L);
    return 0;
}

我的测试是:主函数中的L确实会改变。请问,这是因为数组本身是指针。还是因为我在哪里搞错了,需要另写指针返回?谢谢。

ringa_leeringa_lee2713 天前1330

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:47:18

    void test(float L[25] [30])
    上面的聲明,等同於
    void test(float L[][30]);

    void test(float (*L)[30]);
    數組做為函數參數時,會被當成指標處理。所以數組的特性就沒有了,你可以嘗試在test(L)函數內sizeof(L)和在函數外sizeof(L),可以看出,兩個輸出是不同的,數組有數組長度信息,而指針卻沒有指向內容的長度訊息,這也是為什麼很多時候,api設計時,涉及陣列和指標參數的api一般會傳一個長度訊息參數。
    另外,test(L);
    其中L是指L[0] [0]的位址,你可以嘗試 輸出 **L。
    總結:
    1.數組不是指針,數組有數組長度信息,指針沒有。
    2.做為函數參數時,陣列會被看成指標。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 13:47:18

    都是數組了肯定會變的
    因為你聲明分配了一大塊內存你傳遞的數組名就是內存的首地址
    然後你操作數組還是修改這一個內存區域的數據
    所以...

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:47:18

    對 作為函數參數時,數組名稱會變成指針,因此你實際上操作的是指針指向的內存區域,也就是你在主函數棧中申請的數組的那塊內存

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:47:18

    當陣列作為函接參數時,會退化為同類型的指標
    test函數裡操作的就是原始數組對應的記憶體區域。

    回覆
    0
  • 取消回覆