首页  >  问答  >  正文

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_lee2764 天前1364

全部回复(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
  • 取消回复