c++数组传参
最近感觉老是碰到数组传参的问题,特别是二维的数组,每次报错都感觉头疼,烦躁;这里必须总结一下了,先把暂时能解决的问题写在这吧,以便以后碰到查看!
先看一个一维数组传参:这样用数组传参是很不安全的;会输出乱码。原因是函数返回的是一个数组,其保存的字符串" "存储在栈中,函数结束后存储该字符串的内存(也就是栈上的内存)被编译器自动释放了。
恩今天3-21;遇到了一个新的问题比较有意思;关于数组。
void print_1 (int n, int *a ) { //for(int i=0;i<n;i++){ a[n]={1,2,3};//为什么数组不允许这么赋值? } } int main(){ int n=3; int datas[n]={0}; print_1(n, datas); for (int i = 0; i < n; ++i) cout << datas[i] << " "; return 0; }
编译器报的错:error: cannot convert '<brace-enclosed initializer list>' to 'int' in assignment
因为在main()里,已经对datas这个数组初始化了,那么datas这个数组名作为一个指针,已经指向了内存中的一个位置,so不能再次对它初始化,所以只能用循环语句
给它赋值,让他指向新的内存单元。
#include<iostream> using namespace std; #define A 5 char * init_code(){//声明是这样的; char list[A]={'a','b','c','d','e'}; return list;//这样是没问题的,它传的只是list这个指针的地址,并不会传这个数组的大小; } int main(){ char *tt=init_code();//调用时是这样的; for(int i=0;i<A;i++){//这里定义了地址之后的大小; cout<<tt[i]<<endl;//在函数中是这样的; } return 0; }
二维数组的传参:
#include<iostream> using namespace std; typedef char(*R)[3];//定义二维数组R类型 R func(){ char list[2][3];//这里的char还不能写为R; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ list[i][j]='a'; } } return list; } int main(){ R x=func();//此时x是二维数组类型的,将返回值付给他; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ cout<<x[i][j];//如此调用 } cout<<endl; } return 0; }
一维数组的调用方法上边那个是不对的,正确的应该是下边:
void print_1 (int n, int *datas ) { for (int i = 0; i < n; ++i) { cout << datas[i] << " "; } cout << endl; } int main(){ const int N = 3; int datas[N] = {1, 2, 3}; print_1 (N, datas); return 0; }
或者这样:
template<int N>//模板是个好东西,可以让传入的参数的类型变为一个变 //值,从而简化代码冗余 void print_4 (int (&datas)[N]) { for (int i = 0; i < N; ++i) { std::cout << datas[i] << " "; } std::cout << std::endl; } int main(){ const int N = 3; int datas[N] = {1, 2, 3}; print_4 (datas); int datas2[N - 1] = {1, 2}; print_4 (datas2); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?