timleee

导航

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);
}

 


posted on 2017-03-18 16:15  timleee  阅读(2035)  评论(0编辑  收藏  举报