zoukankan      html  css  js  c++  java
  • C/C++中数组作为函数形参后退化为指针

    最近写了一个函数,把数组作为了它的参数,在这个函数中用到了这个数组的长度,按照正常的求长度的方式,应该不会出错;但是运行之后发现结果却不是我想要的。于是写了一个测试程序来验证我的猜想。

    #include <iostream>
    
    using namespace std;
    
    void Sort(int nSortArray[6])
    {
        int nLen = sizeof(nSortArray) / sizeof(nSortArray[0]);
        int nTmp = 0;
        for (int i = 0; i < nLen; i++)
        {
            for (int j = i+ 1; j < nLen; j++)
            {
                if (nSortArray[i] > nSortArray[j])
                {
                    nTmp = nSortArray[i];
                    nSortArray[i] = nSortArray[j];
                    nSortArray[j] = nTmp;
                }
            }
        }
    }
    
    int main()
    {
        int nArray[6] = { 0, 8, 3, 2, 10, 9 };
        cout << "排序前......" << endl;
        for (int i = 0; i < sizeof(nArray) / sizeof(nArray[0]); i++)
        {
            cout << nArray[i] << "," ;
        }
        cout << endl;
        Sort(nArray);
        cout << "排序后......" << endl;
        for (int i = 0; i < sizeof(nArray) / sizeof(nArray[0]); i++)
        {
            cout << nArray[i] << "," ;
        }
    
        system("pause");
        return 0;
    }

    上述代码是为一个数组排序,打印结果发现,前后的结果并没有什么改变,断点调试发现它的长度只是1;如下所示:

    也就是说sizeof(nSortArray)的长度和sizeof(nSortArray[0])的长度是等价的,而sizeof(nSortArray[0])是数组的首地址的长度,即它相当于一个指针,指向数组首值的位置;那么结果自然而然出来了,nSortArray作为形参后,就只是当做一个指针来使用了,它指向数组的首位置。所以正确的写法应该如下所示:

    #include <iostream>
    
    using namespace std;
    
    void Sort(int nSortArray[], int nLen)
    {
        int nTmp = 0;
        for (int i = 0; i < nLen; i++)
        {
            for (int j = i + 1; j < nLen; j++)
            {
                if (nSortArray[i] > nSortArray[j])
                {
                    nTmp = nSortArray[i];
                    nSortArray[i] = nSortArray[j];
                    nSortArray[j] = nTmp;
                }
            }
        }
    }
    
    int main()
    {
        int nArray[6] = { 0, 8, 3, 2, 10, 9 };
        cout << "排序前......" << endl;
        for (int i = 0; i < sizeof(nArray) / sizeof(nArray[0]); i++)
        {
            cout << nArray[i] << "," ;
        }
        cout << endl;
        Sort(nArray, sizeof(nArray)/sizeof(nArray[0]));
        cout << "排序后......" << endl;
        for (int i = 0; i < sizeof(nArray) / sizeof(nArray[0]); i++)
        {
            cout << nArray[i] << "," ;
        }
    
        system("pause");
        return 0;
    }

    从上面代码也可以看出,数组除了作为形参退化为指针,其他情况下都是能够正常求取数组的长度的

  • 相关阅读:
    Android Packaging Problem
    Dedecms中{dede:type}标签支持调用父级栏目名称
    DeDecms远程写入漏洞webshell (dedecms漏洞)
    Dedecms 目标仿站的学习视频
    关于前端JS走马灯(marquee)总结
    浏览器端如何使用VConsole.js调试代码?
    Firefox中input元素,不能重新获取焦点函数focus()
    Centos7 systemctl添加自定义系统开机服务
    织梦cms 内容模型 option下拉框 value 分离
    wdcp如何添加反向代理功能
  • 原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11480091.html
Copyright © 2011-2022 走看看