数组与函数

1.关于数组

不能将一个数组赋值给另一个数组
        int cards[4]={0,1,2,3};
        int hand[4];
        hand = cards; //wrong;
        hand[4] = {2,3,4,5};// wrong,数组只有在定义时才能初始化,此后不能,但是可以用下标分别给数组中的元素赋值
注:但是结构体struct可以用赋值运算符(=)将结构赋给另一个同类型的结构, 即使结构中包含数组成员
 
数组名是第一个元素的地址,而对整个数组名应用地址运算符时,得到的是整个数组的地址。
    
        short tell[10];
        cout<<tell<<endl; //display &tell[0];
        cout<<&tell<<endl;//display address of whole array

数字上这两个地址相同。但概念上,&tell[0] 是一个2字节的内存块地址,而&tell是一个20字节的内存块地址。

2.函数和数组:如何将数组作为参数传递给函数?

牢记:数组名是该数组的起始地址,在函数中相应的形参应该是一个指针!
// 也可以用int sumfun(int * arr,int n)。当且仅当用于函数头或函数原型中,
// int * arr和int arr[]含义相同,都意味着arr是一个指针,
// 但 int arr[]:arr不仅指向int,还指向int的一个数组
int sumfun (int arr[],int n)
{
    int total = 0;
    for(int i = 0;i<n;i++){
        total += arr[i];
    }
    return total;
}
int main()
{
    int wages[4] = {1,2,3,4};
    int sum = sumfun(wages,4);  // 数组名wages是数组的地址,是一个指针,
                                // 4告诉函数数组的长度,不能直接传递sumfun( wages[4])
    cout<<"sum = "<<sum<<endl;
    return 0;
}

总结:数组处理函数的常用编写方式:

  • 如果要修改该数组: void f_modify( double arr[],int n);
  • 如果不修改数组:     void f_no_change(const double arr[],int  n);

3.函数和二维数组

牢记:数组名是该数组的起始地址,在函数中相应的形参应该是一个指针!
    int data[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    int total = sum(data , 3);

data是数组名,该数组有3个元素,每个元素是由4个int值组成的一维数组。因此,data的类型是指向由4个int值组成的一维数组的指针。因此函数原型(prototype)为:

// 方式1
int sum ( int (*ar)[4] , int size); 
// 方式2
int sum(int ar[][4], int size);//可读性更强

这两个原型都指出ar是指针而不是数组,指针类型还指出它指向由4个int组成的数组,因此指针类型指定了列数,所以不需要把列数作为参数单独传递,而只需传递行数。

注:int (*ar)[4]中的()必不可少,(优先级()>[ ]>*) ,它声明一个指针,该指针指向由4个int值组成的数组;
而 int *ar[4] 将声明一个数组,该数组由4个int指针组成。
那么,在定义的函数中如何使用该二维数组呢? 将ar看成是二维数组的名称:    
int sum(int ar[][4],int size){
    int total = 0;
    for ( int r=0;r<size;r++){
        for ( int c = 0;c<4;c++){
            total = total +ar[r][c];   //ar[r][c] == *(*(ar+r)+c)
        }
    }
    return total;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯Jungle

您的支持是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值