注册 登录
编程论坛 C++教室

关于数组作为参数的问题

wenxinwukui 发布于 2010-11-16 10:17, 1012 次点击
请看一下这个小程序:
void print(int x[]){
    int m = sizeof(x)/sizeof(x[0]);

    for(int i = 0;i< m ;i++){
        cout<<x[i]<<" ";
    }
    cout<<endl;
}
int main(){
    int a[] = {1,2,3};
    print(a);
}
这个程序的输出结果是:
1
请问有没办法输出整个数组中的元素:也就是有没有办法使得传到函数print中的是整个数组,而不仅仅是数组的首地址?(除了在print中加入数组大小size即写成print(int a[],size)这种方法外,有没有其他方法?)
9 回复
#2
zkkpkk2010-11-16 10:19
C++没有真正的数组,都是传首地址的
#3
玩出来的代码2010-11-16 14:04
将数组传递到函数中数组首地址会退化成指针,
传引用 void print(int (&a)[3]),但常用的方法就是传首地址+数组个数。
#4
VenusNefu2010-11-24 12:54
回复 楼主 wenxinwukui
int m = sizeof(x)/sizeof(x[0]);
中,x只是一个地址,我的机子是32位地址,所以 sizeof(x)为4字节
sizeof(x[0])中,因为存储的是int4字节,所以sizeof(x[0])为4字节

所以m=1
#5
pangding2010-11-24 23:17
C 式的方法就是传数组及大小。
C++ 式的方法就是把这些东西包装成一个类,而类内部有识别自身长度的方法。对这个问题其实不仅没变简单,反而复杂化了。
#6
南国利剑2010-11-25 00:57
回复 楼主 wenxinwukui
简单的说。在作为参数是数组名会退化为指针。
至于为什么会这样。那就是这个语句在C++和C中的底层都是当做指针处理的。
你可以对你的程序进行反汇编看看,应该就能够清楚了。
#7
wenxinwukui2010-11-25 10:06
多谢各位指教啊,谢谢
#8
laoyang1032010-11-25 15:53
#include <iostream>
using namespace std;
void print(int a[])
{
    for(int i = 0;i<10;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    int *p=new int[10];//把数组建立在堆内存上面  不出现delete之前他是不会被释放掉的
    for(int i=0;i<10;i++)//也就是它的生存期是碰到delete[]p;之前
        p[i]=i;
    print(p);
    system("pause");
    delete[]p;//释放掉数组
    return 0;
}
楼主如果可以把int *p=new int[10]; 改成int a[10]={.........};可以看到输出结果还是就一个1
这是因为int a[10]={.........};会把数组建立在栈上面 它会由编译系统自动释放掉;
#9
寒风中的细雨2010-11-25 16:25
只有本站会员才能查看附件,请 登录
#10
kittel2010-11-26 17:17
回复 楼主 wenxinwukui
print函数里的参数用指针或引用传递,如果用整个数组很浪费资源,编程效率低。
1