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; }
从上面代码也可以看出,数组除了作为形参退化为指针,其他情况下都是能够正常求取数组的长度的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?